发送明确的意图不起作用

时间:2013-03-13 01:45:52

标签: android android-intent broadcastreceiver android-service

我想将具有指定组件的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);
        }
    };
}

2 个答案:

答案 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);