0

Service我想将带有指定组件的显式意图发送到Activity. 我已经BroadcastReceiverMainActivity.java.

当我不为 设置组件时Intent,它会在活动中接收。但是对于指定的组件,它就不起作用了。为什么?

广播服务.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);
        }
    };
}
4

2 回答 2

3

正如文档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+ 中可用)。启动服务时,您将 aResultReceiver放入意图中。当服务想要向活动发送信息时,您可以通过ResultReceiver给定的方式进行。

于 2013-03-13T02:45:34.157 回答
0

如果您无法发送显式广播或显式意图 - 首先检查 ComponentName。包名称必须是应用程序 ID,而不是您可以在接收器类中看到的包名称。

在 build.gradle 中查找应用程序 ID:

             defaultConfig {
                            applicationId "com.my.app.id.name"

或在构建后自动生成的 buildConfig.java 文件中:

应用\构建\生成\源\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);
于 2019-04-17T15:10:10.467 回答