BroadcastReceiver,Service和Activity共享Application对象吗?

时间:2015-02-21 08:41:08

标签: android android-activity android-service android-broadcast android-context

我有以下组件:

  • 在Manifest中注册的BroadcastReceiver
  • STICKY服务通常由启动完成启动,处理来自上述Intent的{​​{1}}
  • BroadcastReceiver绑定的Activity(如果是某些人,则启动它) 原因不存在)

这些组件在哪些情况下共享同一个Application对象?

有时,Service可以绑定到Activity,而其他时间Service onBind()未被调用,而Service收到Activity {1}} null中{1}} IBinder

现在共享代码的部分太多了。根据讨论,我可以在得到具体想法时分享相关部分。

2 个答案:

答案 0 :(得分:1)

您的问题的简短回答是ActivityServiceBroadcastReceiver个对象确实共享相同的Application对象

  • 只要它们运行的​​过程仍然存在
  • 以及这些组件是否在同一个流程中运行,这是默认行为

有时,运行Service对象的进程可能会被终止并且稍后会生成一个新进程。在这种情况下,内核(而不是Dalvik VM)回收内存,因此引用的Application对象与以前不同。

答案 1 :(得分:0)

Android应用中的许多地方总是需要一些信息。例如,它可以是会话令牌。

有时建议的模式是将数据转储到Application对象中,并认为它可以在所有活动和其他组件(如Service或BroadcastReceiver)中使用。

class MyApplication extends Application {

    String name;

    String getName() {
        return name;
    }

    void setName(String name) {
        this.name = name;
    }
} 

App组件可以像下面这样使用它:

class NameActivity extends Activity {

    void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.your_layout);

        // Just assume that in the real app we would really ask it!
        MyApplication app = (MyApplication) getApplication();
        app.setName("set name here");   

    }

}

所以,是的,活动,服务等应用程序组件共享相同的Application对象,只要它们运行的​​进程保持活动状态。

其次,How come sometimes the Activity can bind to the Service while at other times onBind() of the Service is not called and the Activity receives a null

可能有不同的原因可能发生以上情况:
1.执行IBinder的服务可能已被操作系统杀死 2.服务已创建,可能需要一些时间才能完全初始化。在此初始化完成之前,如果Activity等组件尝试绑定它。