我无法从AsyncTask访问Application Class,或者使用上次更新数据的SharedPreferences等问题。
基本上为什么我需要我的全局变量是跟踪当前活动的活动,它应该可以从任何类型的类访问,例如活动, AsyncTask ,服务,接收方,应用等等......
我知道这里有很多问题=答案,但没有一个帮助过我。
我尝试了几种方法来做到这一点,但找不到任何真正的解决方法。
使用 SharedPreferences ,我可以使用它,但在首选项更新和重新启动后,返回之前的值,仅在重新启动应用后才有效。
使用应用程序类,没有运气,无法从AsyncTask和服务访问应用程序
服务每5秒运行一次 AsyncTask ,AsyncTask应该知道MainActivity是否已打开并运行,因此它可以更新内容。
我得到了很多东西,但是,有了这个,我花了太多时间进行搜索。
所以,如果有人可以帮我这个,那就太好了。 :)
以下是我的例子......
MainActivity.java
public class MainActivity extends Activity {
private boolean active = false;
SharedPreferences prefs;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_activity);
this.prefs = context.getSharedPreferences("com.my.app", Context.MODE_PRIVATE);
storeActivity("MainActivity");
this.active = true;
((App) this.getApplication()).setTopActivity("MainActivity");
}
public void storeActivity(String TOP_ACTIVITY) {
SharedPreferences.Editor editor = prefs.edit();
editor.putString("TOP_ACTIVITY", TOP_ACTIVITY);
editor.apply();
editor.commit();
}
@Override
public void onResume() {
super.onResume();
((App) this.getApplication()).setTopActivity("MainActivity");
this.active = true;
storeActivity("MainActivity");
}
@Override
public void onPause() {
super.onPause();
((App) this.getApplication()).setTopActivity("");
this.active = false;
storeActivity("");
}
@Override
public void onStart() {
super.onStart();
((App) this.getApplication()).setTopActivity(ACTIVITY_NAME);
this.active = true;
storeActivity("MainActivity");
}
@Override
public void onStop() {
super.onStop();
((App) this.getApplication()).setTopActivity("");
this.active = false;
storeActivity("");
}
}
这是我的应用程序对象,
App.java
public class App extends Application {
private String TOP_ACTIVITY;
public String getTopActivity() {
return TOP_ACTIVITY;
}
public void setTopActivity(String CURRENT_ACTIVITY) {
this.TOP_ACTIVITY = CURRENT_ACTIVITY;
}
public static Application getApplication() {
return new App();
}
}
这里有一些从服务器获取信息的AsyncTask
Socket.java
public class SocketUpdater extends AsyncTask<String,Void,String> {
private Context context;
private SharedPreferences prefs;
public SocketUpdater(Context context) {
this.context = context;
this.prefs = context.getSharedPreferences("com.my.app", Context.MODE_PRIVATE);
}
@Override
protected String doInBackground(String... arg0) {
StringBuffer result = new StringBuffer("");
return new String(result);
}
@Override
protected void onPostExecute(String result) {
Toast.makeText(context, "RESULT: " + result, Toast.LENGTH_SHORT).show();
String TOP_ACTIVITY = ((App) this.getApplication()).getTopActivity();
// THIS CANT WORK, NO this.getApplication()!!!
boolean MainActivityActive = MainActivity.active;
// THIS RETURNS ME FALSE ALL THE TIME
SharedPreferences.Editor editor = prefs.edit();
String PREF_TOP_ACTIVITY = prefs.getString("TOP_ACTIVITY", "");
if(MainActivityActive) {
Toast.makeText(context, "NEVER FIRES!", Toast.LENGTH_LONG).show();
}
if(TOP_ACTIVITY.equals("MainActivity")) {
Toast.makeText(context, "NEVER FIRES!", Toast.LENGTH_LONG).show();
}
if(PREF_TOP_ACTIVITY.equals("MainActivity")) {
Toast.makeText(context, "NEVER FIRES!", Toast.LENGTH_LONG).show();
}
}
}
答案 0 :(得分:0)
为什么不使用&#34; Otto&#34;广场的图书馆?您可以在活动和服务之间轻松发送对象。我出于类似目的在我的申请中使用它。
答案 1 :(得分:0)
我花了好几天时间来寻找导致问题的原因。
我为此找到了简单的解决方案,并且让所有方法都像我想要的那样工作。
事情就是我让我的服务运行自己的分离过程:
<service android:name="fi.hgs.apps.MyService"
android:process=":myService"
</service>
刚刚从AndroidManifest.xml中删除 android:process =&#34;:myService&#34;