我想从Service
发送带有指定组件的明确意图到Activity
。我在BroadcastReceiver
中动态定义了MainActivity.java
。
当我没有为Intent
设置组件时,它会在活动中收到。但是使用指定的组件,它不起作用。为什么?
broadcast service.Java:
public class BroadcastService extends IntentService {
@Override
public void onCreate() {
super.onCreate();
intent = new Intent();
ComponentName component = new ComponentName(
MainActivity.class.getPackage().getName(),
MainActivity.class.getName());
intent.setComponent(component);
}
@Override
protected void onHandleIntent(Intent intent) {
intent.putExtra("time", new Date().toLocaleString());
sendBroadcast(intent);
}
}
main activity.Java:
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
updateUI(intent);
}
};
}
正如documentation of Intent.setComponent()
所说:
(通常是可选的)显式设置组件以处理意图。如果保留默认值null,系统将根据Intent中的其他字段(操作,数据,类型,类别)确定要使用的相应类。如果定义了此类,则无论其他字段如何,都将始终使用指定的类。只有当您知道绝对需要使用特定类时,才应设置此值;否则最好让系统找到合适的类,以便您尊重已安装的应用程序和用户首选项。
但你在做:
intent = new Intent();
ComponentName component = new ComponentName(
MainActivity.class.getPackage().getName(),
MainActivity.class.getName());
intent.setComponent(component);
这意味着您设置了一个指向MainActivity
的组件,而不是MainActivity
中的广播接收器,因此它不起作用。
要修复,您可以将内部广播接收器移动到单独的类中。但如果是这样,你就无法与MainActivity
中的控件进行交互。存档目标还有很多其他方法。我建议ResultReceiver
(API 3+提供)。在开始服务时,你将ResultReceiver
放入意图中。当服务想要向活动发送信息时,您可以通过给出的ResultReceiver
来完成。
如果您无法发送显式广播或显式意图 - 请先检查ComponentName。包名称必须是应用程序ID,而不是您在接收器类中可以看到的包名称。
在build.gradle中查找应用程序ID:
defaultConfig {
applicationId "com.my.app.id.name"
或者在构建后自动生成的buildConfig.java文件中:
应用\构建\产生\源\ buildConfig \释放\
package com.my.app.id.name;
例如,如果您的类名是“MyExplicitReciver”,并且您可以在此类的第一行中看到的包名称是
package com.my.app.myPackage.name.receivers;
所以类名应该是:com.my.app.myPackage.name.receivers.MyExplicitReciver
你应该在setComponent中设置这样的组件名称:
intent.setComponent(new ComponentName("com.my.app.id.name",
"com.my.app.myPackage.name.receivers.MyExplicitReciver"));
context().sendBroadcast(intent);