我需要检查我的注册接收者是否仍然注册,如果不是我如何检查任何方法?
api android broadcastreceiver android-broadcast android-broadcastreceiver
我在AndroidManifest中声明了一些接收器:
<!-- no warning -->
<receiver
android:name=".receivers.TriggerMonitoringBootReceiver"
android:enabled="false">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
<!-- no warning -->
<receiver
android:name=".receivers.ScanResultsReceiver"
android:enabled="false">
<intent-filter>
<action android:name="android.net.wifi.SCAN_RESULTS" />
</intent-filter>
</receiver>
<!-- warning : Exported receiver does not require permission-->
<receiver
android:name=".receivers.BatteryMonitoringReceiver"
android:enabled="false">
<intent-filter>
<action android:name="@string/intent_action_setup_alarm" />
<action android:name="@string/intent_action_cancel_alarm" />
<action android:name="@string/intent_action_monitor" />
</intent-filter>
</receiver>
Run Code Online (Sandbox Code Playgroud)
第一个是为了接受一个BOOT_COMPLETED
动作.第二个是接收android.net.wifi.SCAN_RESULTS
.第三个是接收我广播的一些动作(intent_action_monitor)和AlarmManager
(intent_action_setup_alarm等)广播的一些动作.
两个问题:
exported="false"
做的启动接收器,无线接收器,报警接收等?android:protectionLevel="signatureOrSystem"
但文档建议不要使用此保护级别和自定义权限.那我该如何处理这个警告呢?将非常感谢链接到文档和/或一些代码.
android broadcastreceiver android-manifest android-permissions android-broadcastreceiver
在我的应用程序中,我有一个BroadcastReceiver
通过<receiver>
标签作为组件启动,过滤android.net.conn.CONNECTIVITY_CHANGE
意图.
我的目标只是知道何时建立了Wifi连接,所以我在做的onReceive()
是:
NetworkInfo networkInfo = intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO);
if(networkInfo.getType() == ConnectivityManager.TYPE_WIFI && networkInfo.isConnected()) {
// Wifi is connected
}
Run Code Online (Sandbox Code Playgroud)
它工作正常,但在建立Wifi连接时,我似乎总是在大约一秒钟内得到两个相同的意图.我想看看任何信息,我可以从意图,获得ConnectivityManager
和WifiManager
,但我无法找到任何区别这两种意图.
查看日志,至少还有一个BroadcastReceiver
也接收到两个相同的意图.
它运行在搭载Android 2.2的HTC Desire上
任何想法为什么我似乎在Wifi连接时获得"重复"的意图或两者之间的差异可能是什么?
我已经检查了所有相关问题,但没有找到解决此问题的任何方法.所以这对我来说是一个绝对新的问题.
是)我有的
我有一个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" />
<application
android:name=".base.MyApp"
android:allowBackup="false"
android:icon="@drawable/ic_launcher"
android:label="@string/label_app_name"
android:largeHeap="true"
android:supportsRtl="true"
android:theme="@style/AppTheme"
tools:replace="label, allowBackup">
<receiver android:name=".mics.BootReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="android.intent.action.QUICKBOOT_POWERON" />
</intent-filter>
</receiver>
<receiver android:name=".PhoneCallReceiver">
<intent-filter>
<action android:name="android.intent.action.NEW_OUTGOING_CALL" …
Run Code Online (Sandbox Code Playgroud) android broadcastreceiver android-broadcast android-broadcastreceiver
我一直在尝试做类似于truecaller应用程序的东西,我的应用程序应该在呼叫挂断后显示一个屏幕.通过android.intent.action.PHONE_STATE
在manifest
文件中注册隐式广播来实现这一点.
但是,如果我将应用程序更改为目标Android O,则无法正常工作,因为Android O广播限制,我正在尝试找出此用例的替代解决方案.
替代方案建议在Android的文档:Job scheduler
或注册一个service
与context
.
作业调度程序:由于Job scheduler
优化,接收回调会有一些延迟.因此,如果我们的应用程序屏幕在电话呼叫后几分钟显示,并且每隔几秒检查一次新的呼叫记录就会导致电池耗尽问题,这将影响用户体验.
在Java中使用上下文注册服务:即使应用程序未处于活动状态或活动状态,我也希望该行为能够正常工作.如果系统杀死了,这将无效Service
.
注册前台服务:这需要一直向用户显示通知,这将是用户的垃圾邮件,并且全天候运行服务会消耗大量资源,这会破坏广播限制的整个目的.
请建议一个替代解决方案,以便用户体验保持不变.
提前致谢
performance android android-broadcast android-broadcastreceiver android-8.0-oreo
我正在尝试在我的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
Run Code Online (Sandbox Code Playgroud)
(消息在一行中,但这样更易读)
我怎么能以正确的方式做到这一点?
android bootcompleted android-broadcastreceiver android-8.0-oreo
目前我正在开发一个类似Truecaller的呼叫拦截器应用程序.
我需要什么
即使我的应用程序已从最近的应用程序列表中删除,我也想检测来电.
Manifest.xml代码
<receiver android:name=".PhoneStateReceiver">
<intent-filter>
<action android:name="android.intent.action.PHONE_STATE" />
</intent-filter>
</receiver>
Run Code Online (Sandbox Code Playgroud)
我的广播接收器代码
@Override
public void onReceive(Context context, Intent intent) {
//my call blocking code
}
Run Code Online (Sandbox Code Playgroud)
我的问题
我的BroadcastReceiver不会在后台工作,就像我从最近的应用列表中删除一样.
我的完整清单代码在这里
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="ranjith.callblocker">
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.GET_TASKS" />
<application
android:allowBackup="true"
android:enabled="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<receiver
android:name=".PhoneStateReceiver"
android:enabled="true"
android:exported="true"
android:process=":anotherProcess">
<intent-filter android:priority="1000">
<action android:name="android.intent.action.PHONE_STATE" />
</intent-filter>
</receiver>
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:theme="@style/AppTheme.NoActionBar">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application> …
Run Code Online (Sandbox Code Playgroud) android broadcastreceiver android-service android-broadcastreceiver
我在我的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)
Run Code Online (Sandbox Code Playgroud) java android broadcastreceiver android-broadcast android-broadcastreceiver
我有一个后台服务,调用GoogleAuthUtl.getTokenWithNotification
它,它正常工作,但我正在尝试实现此功能的回调部分,但是无法正常工作.
我已经实现了一个广播接收器并将其添加到清单中,我的应用程序中也有一个活动.以下是相关的代码段.
GoogleAuthUtil.getTokenWithNotification
GoogleAuthUtil.getTokenWithNotification(this.getContext(), account, "oauth2:" + GmailScopes.GMAIL_SEND, null, new Intent(AuthReceiver.AUTH_INTENT));
Run Code Online (Sandbox Code Playgroud)
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();
}
}
Run Code Online (Sandbox Code Playgroud)
AndroidManifest
<receiver android:name=".AuthReceiver" android:enabled="true" android:exported="true">
<intent-filter>
<action android:name="com.testoauth.AUTH_INTENT" />
</intent-filter>
</receiver>
Run Code Online (Sandbox Code Playgroud)
我不知道为什么它没有收到广播.我没有在日志中看到任何异常,并且没有任何迹象表明接收器完全被调用,它在调试时甚至不会在断点处中断.我做错了什么吗?
编辑
我正在使用min sdk 16和目标sdk 25
从GoogleAuthUtil.getTokenWithNotification API文档中:
此方法专门用于后台任务.如果出现需要用户干预的错误,此方法负责推送相关通知.在用户解决通知之后,广播回叫.如果用户取消,则不会触发回调.
无论用户是否取消,都不会触发回调.除了ActivityManager
显示通知(Displayed com.google.android.gms/.auth.uiflows.gettoken.GetTokenActivity
)的说法之外,没有迹象表明com.testoauth.AUTH_INTENT
已经在日志中发送了指定的广播意图(在这种情况下)."收到的Auth广播".日志中也没有消息.
包含此功能( …
android google-authentication google-play-services google-oauth android-broadcastreceiver
为了创建一个接收器,我WakefulBroadcastReceiver
在我的旧项目中进行了扩展.但现在是deprecated
.而不是WakefulBroadcastReceiver
它Receiver
,我应该现在使用以及如何将下面的代码转换的新方法?
这是我的代码:
public class TaskFinishReceiver extends WakefulBroadcastReceiver {
private PowerManager mPowerManager;
private PowerManager.WakeLock mWakeLock;
@Override
public void onReceive(Context context, Intent intent) {
mPowerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
turnOnScreen();
Intent wakeIntent = new Intent();
wakeIntent.setClassName("com.packagename", "com.packagename.activity.TaskFinished");
wakeIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(wakeIntent);
}
public void turnOnScreen(){
mWakeLock = mPowerManager.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "tag");
mWakeLock.acquire();
}
}
Run Code Online (Sandbox Code Playgroud) android ×10
android-wifi ×1
api ×1
google-oauth ×1
java ×1
performance ×1
powermanager ×1
receiver ×1