Do BroadcastReceiver、Service和Activity共享应用程序对象



我有以下组件:

  • 在清单中注册的BroadcastReceiver
  • 一个STICKY服务,通常由引导完成启动,处理来自上述BroadcastReceiverIntent
  • 与CCD_ 5结合的CCD_原因不存在)

在什么情况下,这些组件共享同一个应用程序对象?

为什么有时Activity可以绑定到Service,而其他时候ServiceonBind()没有被调用,而ActivityonSuccess()中接收到null IBinder???

涉及的部分太多,现在无法共享代码。在讨论的基础上,当我们有了具体的想法时,我可以分享相关的部分。

问题的简短答案是YESActivityServiceBroadcastReceiver对象确实共享相同的Application对象

  • 只要运行它们的进程仍然有效
  • 如果这些组件在同一进程中运行,这是默认行为

偶尔,运行Service对象的进程可能会被杀死,随后会产生一个新的进程。在这种情况下,内存是由内核回收的(而不是由Dalvik VM回收的),因此引用的Application对象与以前不同。

安卓应用程序中的许多地方都需要一些信息。例如,它可以是会话令牌。

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

class MyApplication extends Application {
    String name;
    String getName() {
        return name;
    }
    void setName(String name) {
        this.name = name;
    }
} 

应用程序组件可以像下面这样使用它:

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");   
    }
}

因此,是的,应用程序组件(如"活动"、"服务"等)共享相同的应用程序对象,只要它们运行的进程仍然有效。

其次,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.服务已创建,可能需要一点时间才能完全初始化。在初始化完成之前,如果组件(如"活动")尝试绑定到它。

相关内容

  • 没有找到相关文章

最新更新