我想将具有指定组件的Service
的明确意图发送到Activity
。我已在BroadcastReceiver
动态定义了MainActivity.java
。
当我没有为Intent
设置组件时,它会在活动中收到。但是使用指定的组件,它不起作用。为什么?
BroadcastService.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);
}
}
MainActivity.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);
}
};
}
答案 0 :(得分:2)
正如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
给出。
答案 1 :(得分:0)
如果您无法发送明确的广播或明确的意图,请首先检查ComponentName。包名称必须是应用程序ID,而不是您在接收器类中可以看到的包名称。
在build.gradle中查找应用程序ID:
defaultConfig {
applicationId "com.my.app.id.name"
或在构建后自动生成的buildConfig.java文件中:
app \ build \ generate \ source \ buildConfig \ release \
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);