Articles of android broadcastreceiver

致命exception:android.app.RemoteServiceException:无法在android.os.Handler.dispatchMessage上传递广播

我在我的android应用程序上使用广播消息(从io.socket我发送广播消息到我的活动页面)。 在一些设备三星SM-G950F和SM-A520F我得到一个错误“ Fatal Exception: android.app.RemoteServiceException: can't deliver broadcast ”。 我在Fabric crashlytics上遇到了这个错误,我也无法重现这个问题。 这是我从Fabric获得的日志, Fatal Exception: android.app.RemoteServiceException: can't deliver broadcast at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1813) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:154) at android.app.ActivityThread.main(ActivityThread.java:6776) at java.lang.reflect.Method.invoke(Method.java) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1520) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1410)

广播充电器在Android O中断开

现在Android O的最终API已经发布,并且以下广播都没有列入白名单。我有以下问题: 在我的应用程序(目标API 25),我目前有一个BroadcastReceiver监听ACTION_POWER_CONNECTED和ACTION_POWER_DISCONNECTED系统事件。 现在我想更新我的应用程序来定位Android O,但是这个版本带来了广播行为的巨大变化 : 面向Android O的应用程序不能再在其清单中注册隐式广播的广播接收器。 隐式广播是一种广播,并不是专门针对该应用的。 由于这两个广播都是隐式的,所以我只能通过Context.registerReceiver()方法注册它们,但是问题是:一旦我的应用程序的进程被系统杀死,或者一旦系统清除了我的应用程序的内存由于设备内存不足),广播注册将会丢失。 为了避免这个问题,我可以使用JobScheduler API和ACTION_POWER_CONNECTED的setRequiresCharging方法,但对于ACTION_POWER_DISCONNECTED我必须使用registerReceiver方法。 由于我的应用程序控制设备的音量(基于这些事件),这些事件都不会被遗漏,这一点非常重要。 那么我怎样才能安全地监听Android O中断开的电源事件呢? 顺便说一句。 我有与WIFI断开连接事件相同的问题。 编辑:我很乐意做这个没有来自前台服务的通知

当检测到连通性变化时,更改ListView中随机项目的颜色

我有一个广播接收器,接收连接变化广播。所以它被触发,每当连接变化检测。我有一个列表视图与10个项目。每个项目有一个EditText包含该特定项目的位置从0到9.当广播被接收,从0到9生成一个随机数,根据生成的随机数,我想改变相应文本视图中文本的颜色。 如何实现这个? 我目前的代码是: 的Manifest.xml <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.app.prateek.listviewbroadcastreceiver"> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <receiver android:name=".MyReceiver" android:enabled="true" android:exported="true"> <intent-filter> <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> </intent-filter> </receiver> </application> </manifest> MyReceiver.java package com.app.prateek.listviewbroadcastreceiver; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.widget.Toast; import java.util.Random; public class MyReceiver […]

广播延迟

我们使用广播来传达远程服务和我们的用户界面之间的状态变化。 这样做,我们发现了一个非常奇怪的行为:有时候(我找不到任何线索为什么)这些广播延迟了8秒左右。 我们如何发送它们(很基本, mState只是一个枚举)(远程进程在服务中): Intent intent = new Intent(); intent.setAction(ACTION_STATE_CHANGED); intent.putExtra(EXTRA_STATE, mState); Service.get().sendBroadcast(intent, null); 静态接收器如何注册(App): <receiver android:name=".ServiceStateReceiver"> <intent-filter> <action android:name="service.intent.action.STATE_CHANGE" /> </intent-filter> </receiver> 接收器类(App): public class ServiceStateReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Log.v("State", "State via static received"); } } 现在有时会延迟(总是为了同样的状态) 状态枚举: public enum State { DISCONNECTED, BT_DISABLED, BT_SCANNING, BT_TIMEOUT, […]

安装引用不工作在一些红米设备

我需要跟踪我的android应用程序的安装引用。 它在大多数设备上工作正常。 但是在Redmi设备中,广播没有被触发。 我用Redmi Note 4testing了它 我已经通过亚行和玩商店进行了testing。 两者都不会在Redmi设备中触发广播 以下是我正在使用的代码 public class ReferrerReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Log.d("Broadcast", "RECEIVED!"); } } <receiver android:name=".receiver.ReferrerReceiver" android:exported="true"> <intent-filter> <action android:name="com.android.vending.INSTALL_REFERRER"/> </intent-filter> </receiver> 请build议如果有人面临同样的问题,并得到了一些解决scheme?

Awareness API和Android O使用BroadcastReceiver

我有一个Android应用程序,它使用Awareness API来设置耳机插入时的围栏。 我使用代码中的代码非常类似于https://developers.google.com/awareness/android-api/fence-register实现了AwarenessFence。 我有一个PendingIntent定义为: PendingIntent.getBroadcast(context, 0, new Intent("my.application.packageFENCE_RECEIVER_ACTION"), 0) 然后在我的AndroidManifest.xml文件中 <receiver android:name=".fence.FenceDetector$MyFenceReceiver"> <intent-filter> <action android:name="my.application.packageFENCE_RECEIVER_ACTION" /> </intent-filter> 这是在清单中声明,因为即使我的应用程序在后台,我也想接收广播。 这一切都运行良好的Android 7.0及以下,但是当我在Android 8.0上运行这个时,我得到的错误: BroadcastQueue: Background execution not allowed: receiving Intent { act=my.application.packageFENCE_RECEIVER_ACTION 我认为这是由于Android O上的后台执行的新的限制。 任何人都可以告诉我如何注册一个广播接收器,可以在运行API 26的Android设备的背景中侦听意识栅栏触发器。 让我知道如果有什么不清楚的东西,或者我需要阐述一些东西。 提前致谢

Android的GoogleAuthUtil.getTokenWithNotification意图callback不触发

我有一个后台服务,调用GoogleAuthUtl.getTokenWithNotification ,它工作正常,但我试图实现这个函数的callback部分,这是不正常工作。 我已经实现了一个广播接收器,并将其添加到清单,我也有一个在我的应用程序的活动。 以下是相关的代码片段。 GoogleAuthUtil.getTokenWithNotification GoogleAuthUtil.getTokenWithNotification(this.getContext(), account, "oauth2:" + GmailScopes.GMAIL_SEND, null, new Intent(AuthReceiver.AUTH_INTENT)); AuthReceiver public class AuthReceiver extends BroadcastReceiver { public final static String AUTH_INTENT = "com.testoauth.AUTH_INTENT"; public AuthReceiver() { } @Override public void onReceive(Context context, Intent intent) { Log.d("RECEIVER", "Received Auth broadcast."); NotificationManager notificationManager = (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE); notificationManager.cancelAll(); } } AndroidManifest <receiver android:name=".AuthReceiver" android:enabled="true" android:exported="true"> […]

运行时exceptionAndroid O与boot_completed

我试图在我的BOOT_COMPLETED接收器中启动一个IntentService,但是在Android O(API 26)中,我得到: java.lang.RuntimeException: java.lang.IllegalStateException: Not allowed to start service Intent { act=intent.action.update cmp=packageName.services.OwnService }: app is in background (消息是在一行中,但这种方式更容易阅读) 我怎样才能以正确的方式做到这一点?

Android O:PHONE_STATE广播限制

我一直在试图做类似于truecaller的应用程序,我的应用程序应该在挂断电话后显示屏幕。 通过在manifest文件中注册android.intent.action.PHONE_STATE隐式广播来实现这一点。 但是,如果我将应用程序更改为目标Android O,则无法正常工作,因为Android O广播限制 ,我试图找出针对此用例的替代解决scheme。 在android文档中build议的替代解决scheme: Job scheduler或使用context注册service 。 作业调度程序:由于Job scheduler优化,接收callback会有一些延迟。 因此,如果我们的应用程序屏幕在电话后几分钟显示,并且每隔几秒查询一次新的通话logging,则会影响用户体验,从而导致电量耗尽问题。 在Java中使用上下文注册服务 :即使应用程序未处于活动状态,我也希望该行为能够正常工作。 如果系统杀死Service这将不起作用。 注册一个前台服务 :这就要求用户一直向用户显示一个通知,这个通知是用户的垃圾邮件,而且每天24小时运行一次服务会消耗大量的资源,从而破坏了广播限制的全部目的。 请build议备用解决scheme,以便用户体验保持不变。 提前致谢

Android设备重新启动后广播接收器无法工作

我已经检查了所有相关的问题,并没有find解决这个问题的办法。 所以这对我来说是一个绝对的新问题。 我拥有的 我有一个Android应用程序,它在清单中注册了一些广播接收器。 这是我的清单看起来像。 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" package="com.app.myapp"> <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" /> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.USE_FINGERPRINT" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.READ_CALL_LOG" /> <uses-permission android:name="android.permission.WRITE_CALL_LOG" /> <uses-permission android:name="com.android.vending.BILLING" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.GET_ACCOUNTS" /> <uses-feature android:name="android.hardware.telephony" android:required="false" /> <uses-feature android:name="android.hardware.screen.portrait" android:required="false" […]