发送明确的意图不起作用

问题描述 投票:0回答:2

我想从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);
        }
    };
}
android android-intent broadcastreceiver android-service
2个回答
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来完成。


0
投票

如果您无法发送显式广播或显式意图 - 请先检查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);
© www.soinside.com 2019 - 2024. All rights reserved.