请有人向我提供以下活动/服务/应用程序组合的示例。我有三个,但我已经把我的应用程序弄得一团糟,试图在这个地方传递一堆变量,现在我不知道发生了什么。请注意我是android新手,我最近一直在努力解决这个问题,因为有很多方法可以实现。
我只想看到以下情况发生的3类活动,服务和应用程序:
活动在应用程序中存储变量x,启动服务,然后启动活动2.
服务从Application中检索变量x。
活动2从Application中检索变量x。
请注意,变量x可以是从Int到ArrayList的任何东西,而在我的实际程序中,有很多变量(因此需要应用程序类)。
我真的很感激这个具体例子的一个很好的例子,因为我一直试图解决这一切。如果有人愿意花时间把答案放在一起,我会非常感激。
对于任何问为什么的人来说,整个事情都是音乐播放器。用户选择一首歌,并且(希望)将艺术家/专辑等存储在应用程序中。然后启动服务,控制歌曲播放,从应用程序获取歌曲路径。第二个活动显示带有歌曲信息的UI(也来自应用程序),并具有下一个/上一个按钮,这将改变应用程序中某些变量的值,并指示服务检索新值。如果用户导航,变量将始终存在于应用程序中,因此如果创建了另一个UI,则可以轻松设置歌曲信息。
我使用正确的方法吗?
我可以提供一个我所拥有的例子,但目前这是一团糟。无论如何,如果您认为它可以帮助您帮助我,请在下面请求。
答案 0 :(得分:2)
您无需为此扩展Application
。您可以在某些类中使用静态成员变量,如下所示:
public class Globals {
public static String myVariable;
}
public class Activity1 extends Activity implements View.OnClickListener {
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
...
}
public void onClick(View view) {
// Save song name and stuff
Globals.myVariable = "SongNameAndStuff"; // Save in static global variable
startService(); // with appropriate parameters
startActivity(); // with appropriate parameters
}
}
public class Activity2 extends Activity {
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// Get song name from Globals
String mySongName = Globals.myVariable;
...
}
public class MyService extends Service {
// Access to song name from whatever method needs it:
String mySongName = Globals.myVariable;
}
答案 1 :(得分:0)
我只是使用共享偏好tbh。听起来像你需要的...... 使类可以静态访问,然后创建静态getter和setter方法。
import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.util.Log;
public class OurPreferences {
private static final String TAG = OurPreferences.class.getSimpleName();
private final String PREFERENCES = "MobilityPreferences";
private Context mContext;
private OurPreferences() {
}
private static SharedPreferences getPrefs(Context ctx) {
return ctx.getSharedPreferences("PREFERENCES", Context.MODE_PRIVATE);
}
public static void setRegistrationId(String registrationId,
long timeChanged, Context ctx) {
if (registrationId != null) {
Editor editor = getPrefs(ctx).edit();
editor.putString("registrationId", registrationId);
editor.putLong("timeChanged", timeChanged);
editor.commit();
}
}
public static boolean isRegistered(Context ctx) {
boolean registered = getPrefs(ctx).getString("registrationId", null) != null;
return registered;
}
public static long getRegistrationTimeInMilis(Context ctx){
return getPrefs(ctx).getLong("timeChanged", -1L);
}
答案 2 :(得分:0)
http://developer.android.com/resources/faq/framework.html#3
可以将WeakReferences的HashMap放到Application文件中的对象中并设置其中的值......
现在您可以从服务中获取对Activity的访问权限.... 使用((YOUR_APPLICATION_NFILE_NAME)this.getApplication())。吸气/设定部;
答案 3 :(得分:0)
使用以下代码段:
申请类:
public class ManagerName extends Application {
private static ManagerName singleton;
private String merchant;
public synchronized static ManagerName getInstance(Context context) {
if (null == singleton) {
singleton = new ManagerName();
}
return singleton;
}
public void setMerchant(String merchant) {
this.merchant = merchant;
}
public String getMerchant() {
return merchant;
}
}
在活动中存储和检索值:
public class ActivityName extends Activity {
private ManagerName cacheManager;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.user_details);
cacheManager = ManagerName.getInstance(ActivityName.this);
String merchant = cacheManager.setMerchant("Hello");// Store data in Application Class
String storedValue=cacheManager.getMerchant(); // Retrieve Value from Application class
}
}
你的清单应该是:
<application
android:name=".ManagerName"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<activity>......</activity>
</application>
存储和从应用程序获取值的概念非常简单:
<强> cacheManager.setMerchant( “你好”); 强>
<强> cacheManager.getMerchant(); 强>
如需进一步参考,请查看此链接Application Class.