我有以下组件:
- 在清单中注册的
BroadcastReceiver
- 一个STICKY服务,通常由引导完成启动,处理来自上述
BroadcastReceiver
的Intent
- 与CCD_ 5结合的CCD_原因不存在)
在什么情况下,这些组件共享同一个应用程序对象?
为什么有时Activity
可以绑定到Service
,而其他时候Service
的onBind()
没有被调用,而Activity
在onSuccess()
中接收到null
IBinder
???
涉及的部分太多,现在无法共享代码。在讨论的基础上,当我们有了具体的想法时,我可以分享相关的部分。
问题的简短答案是YES,Activity
、Service
和BroadcastReceiver
对象确实共享相同的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.服务已创建,可能需要一点时间才能完全初始化。在初始化完成之前,如果组件(如"活动")尝试绑定到它。