奥利奥系统中接收器无法接收

4

我知道服务和类似的东西正在受到限制,所以我的接收器在Android Oreo上停止工作。

以下是启动服务的代码 -

Intent intent = new Intent(this, MyService.class);
intent.putExtra("Time", locationUpdatesTime);
intent.putExtra("Dist", locationUpdatesDistance);
startService(intent);

我在我的服务中有这个问题 -

Intent intent = new Intent();
intent.setAction("com.androidandyuk.laptimerbuddy");
intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
intent.putExtra("Lat", thisLat);
intent.putExtra("Lon", thisLon);

sendBroadcast(intent);

但我的接收器从未被调用。经过搜索,我认为我必须注册我的接收器,但我不知道如何使用正确的语法编写代码。有人能帮忙吗?
如果您想给我投反对票,我会很感激您能在评论中说明原因,这样我就可以学习了。我已经寻找答案,但没有找到/理解它,并且我认为我已经清楚地表达了问题。
非常感谢!
更新尝试使用LocalBroadcastManager。
在MainActivity中,我有 -
BroadcastReceiver mMessageReceiver;

在onCreate中,我有以下操作-

mMessageReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            // Get extra data included in the Intent
            String message = intent.getStringExtra("message");
            Log.i("receiver", "Got message: " + message);
        }
    };
    LocalBroadcastManager.getInstance(this).registerReceiver(mMessageReceiver, new IntentFilter("custom-event-name"));

在我的服务中,onLocationChanged。
    Log.i("sender", "Broadcasting message");
                Intent intent = new Intent();
                intent.setAction("custom-event-name");
                intent.putExtra("message", "This is my message!");

 LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(intent);

我看到了发送者的消息,说明这段代码是有效的。

那么我做错了什么呢?


1
请提供一个 [mcve]。 - Code-Apprentice
1
注册在清单文件中的接收器无法接收隐式意图的广播。如果您的发送器和接收器位于同一应用程序和进程中,则停止使用系统广播(Context 上的 sendBroadcast()registerReceiver())。相反,使用 LocalBroadcastManager。这不仅可以让您通过 Android 8.0 中的更改,而且还可以提高速度和安全性。但是,正如 Code-Apprentice 建议的那样,请显示您如何注册此接收器。 - CommonsWare
我之前好像没有注册接收器...不确定?但在Oreo之前它是可以工作的。我试图通过跟随他人的代码来学习,所以只逐渐理解我正在做什么。我尝试遵循这个链接 - https://dev59.com/tWoy5IYBdhLWcg3wD53G 但我的服务没有上下文,我想这就是为什么它不起作用的原因? - AndyCr15
一个Service是一个Context。请注意,LocalBroadcastManager不能跨进程工作。如果您的Service在单独的进程中运行 - 即,在清单文件的<service>元素上具有process属性 - 那么它将无法工作。CommonsWare在上面提到了这一点,但您可能错过了。 - Mike M.
我已经在Oreo上完成了这个示例 - http://sohailaziz05.blogspot.co.uk/2012/04/localbroadcastmanager-intra-application.html,并且它可以正常工作,所以我会尝试将其复制到我的应用程序中。谢谢。 - AndyCr15
2个回答

7

2
创建您的意图,然后将其传递给方法。
 sendImplicitBroadcast(this,new Intent(IntentActions.ACTION_APP_CREATE));

静态方法

public static void sendImplicitBroadcast(Context ctxt, Intent i) {
    PackageManager pm=ctxt.getPackageManager();
    List<ResolveInfo> matches=pm.queryBroadcastReceivers(i, 0);

    for (ResolveInfo resolveInfo : matches) {
        Intent explicit=new Intent(i);
        ComponentName cn=
                new ComponentName(resolveInfo.activityInfo.applicationInfo.packageName,
                        resolveInfo.activityInfo.name);

        explicit.setComponent(cn);
        ctxt.sendBroadcast(explicit);
    }
}

如何获取数据? - Basant

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接