从 AsyncTask 访问应用程序 Class 或来自任何 Classes 的任何其他全局变量

Access from AsyncTask to Application Class or any other Global variables from any Classes

我无法从 AsyncTask 访问应用程序 Class,或者 SharedPreferences 有最后更新的数据等问题。

基本上为什么我需要我的全局变量是为了跟踪当前活动的 activity,它应该可以从任何类型的 class 访问,比如Activity, AsyncTask, Service, Receiver, 申请, 等等...

我知道这里有很多问题=答案,但是 none 对我有帮助。

我尝试了几种方法来做到这一点,但找不到任何真正的解决方案。

使用 SharedPreferences,我可以使用它,但是在更新和读取首选项后,返回以前的值,仅在重新启动应用程序后有效。

使用 Application Class,运气不好,无法从 AsyncTask 和服务访问 Application

Service 每 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();
        }

    }

}

为什么不使用 Square 的 "Otto" 库?您可以在 activity 和服务之间轻松发送对象。我在我的应用程序中出于类似目的使用它。

我花了好几天时间搜索导致问题的原因。

我为此找到了简单的解决方案,并让所有方法都按我想要的方式工作。

问题是我有我的服务 运行 像这样独立的流程:

<service android:name="fi.hgs.apps.MyService"
    android:process=":myService"
</service>

刚刚从 AndroidManifest.xml

中删除了 android:process=":myService"