[英]BroadcastReceiver to detect screen on/off and Service not working
I have a simple BroadcastReceiver
which is suppose to detect when my screen is turning off and on . 我有一个简单的
BroadcastReceiver
,它可以检测我的屏幕何时关闭和打开 。 I'm using Service
instead of Activity
. 我正在使用
Service
而不是Activity
。 I've tried running the service on Android 4.4.2 API 19
, and also Android 6.0 API 23
. 我尝试在
Android 4.4.2 API 19
以及Android 6.0 API 23
上运行该服务。
What am I doing wrong? 我究竟做错了什么?
Also, according to many answers from StackOverflow and ThinkAndroid you're not suppose to add a service inside the AndroidManifest
. 此外,根据StackOverflow和ThinkAndroid的许多答案,您不应该在
AndroidManifest
添加服务。
public class BackgroundService extends Service {
@Override
public void onCreate() {
super.onCreate();
// REGISTER RECEIVER THAT HANDLES SCREEN ON AND SCREEN OFF LOGIC
IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON);
filter.addAction(Intent.ACTION_SCREEN_OFF);
BroadcastReceiver mReceiver = new ScreenReceiver();
registerReceiver(mReceiver, filter);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
boolean screenOn = intent.getBooleanExtra("screen_state", false);
if (!screenOn) {
System.out.println("SCREEN OFF");
} else {
System.out.println("SCREEN ON");
}
return START_NOT_STICKY;
}
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}
My BroadCastReceiver 我的BroadCastReceiver
public class ScreenReceiver extends BroadcastReceiver {
private boolean screenOff;
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
screenOff = true;
} else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) {
screenOff = false;
}
Intent i = new Intent(context, BackgroundService.class);
i.putExtra("screen_state", screenOff);
context.startService(i);
}
}
My AndroidManifest 我的AndroidManifest
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.dahlstore.sosbackground2">
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<service
android:name=".BackgroundService"
android:enabled="true"
android:exported="false" />
<receiver
android:name=".ScreenReceiver"
android:enabled="true"
android:exported="true"></receiver>
</application>
</manifest>
Logcat logcat的
10-24 15:01:00.122 762-762/com.android.systemui E/KeyguardUpdateMonitor: Object tried to add another callback
java.lang.Exception: Called by
at com.android.keyguard.KeyguardUpdateMonitor.registerCallback(KeyguardUpdateMonitor.java:1104)
at com.android.keyguard.KeyguardSelectorView.onResume(KeyguardSelectorView.java:347)
at com.android.keyguard.KeyguardHostView.onScreenTurnedOn(KeyguardHostView.java:1458)
at com.android.keyguard.KeyguardViewManager.onScreenTurnedOn(KeyguardViewManager.java:500)
at com.android.keyguard.KeyguardViewMediator.handleNotifyScreenOn(KeyguardViewMediator.java:1960)
at com.android.keyguard.KeyguardViewMediator.access$2900(KeyguardViewMediator.java:126)
at com.android.keyguard.KeyguardViewMediator$5.handleMessage(KeyguardViewMediator.java:1601)
at android.os.Handler.dispatchMessage(Handler.java:110)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:5368)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:828)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:644)
at dalvik.system.NativeStart.main(Native Method)
UPDATED LOGCAT AFTER CHANGES ACCORDING TO VOLACON_SECRET 根据VOLACON_SECRET更改后更新的LOGCAT
10-24 17:00:32.441 12822-12822/? E/cutils-trace: Error opening trace file:
No such file or directory (2)
10-24 17:00:32.663 12822-12822/? E/memtrack: Couldn't load memtrack module (No such file or directory)
10-24 17:00:32.663 12822-12822/? E/android.os.Debug: failed to load memtrack module: -2
10-24 17:00:36.773 138-744/? E/AudioMTKHardware: setCommonParameters() still have param.size() = 1, remain param = "screen_state=on"
10-24 17:00:37.802 1002-12848/com.microsoft.launcher E/Item: java.sql.SQLException: Unable to run insert stmt on object ms.loop.lib.profile.Application@42a65780: INSERT INTO `application` (`applicationInstalledAt` ,`applicationLastUsedAt` ,`applicationName` ,`applicationUninstalledAt` ,`applicationUpdatedAt` ,`deviceId` ,`locationLabel` ,`packageName` ,`annotations` ,`updatedAt` ,`changedAt` ,`createdAt` ,`entityId` ,`score` ,`persist` ,`createSignalSent` ,`annotationsChanged` ) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)
10-24 17:00:40.124 1053-1053/com.google.process.gapps E/NetworkScheduler.SR: Invalid parameter app
10-24 17:00:40.124 1053-1053/com.google.process.gapps E/NetworkScheduler.SR: Invalid package name : Perhaps you didn't include a PendingIntent in the extras?
10-24 17:00:41.684 1067-3062/com.google.android.gms E/Drive.UninstallOperation: Package still installed com.dahlstore.sosbackground2
10-24 17:00:41.923 138-18033/? E/AudioMTKHardware: setCommonParameters() still have param.size() = 1, remain param = "screen_state=off"
10-24 17:00:42.026 1067-12852/com.google.android.gms E/IntentOperationSvc: Failed to instantiate Chimera operation impl, dropping operation
10-24 17:00:42.027 6694-6694/com.android.vending E/Finsky: [1] com.google.android.finsky.wear.bo.a(836): onConnectionFailed: ConnectionResult{statusCode=API_UNAVAILABLE, resolution=null, message=null}
10-24 17:00:42.278 1053-1053/com.google.process.gapps E/NetworkScheduler.SR: Invalid parameter app
10-24 17:00:42.278 1053-1053/com.google.process.gapps E/NetworkScheduler.SR: Invalid package name : Perhaps you didn't include a PendingIntent in the extras?
10-24 17:00:43.576 12905-12905/com.whatsapp E/dalvikvm: Could not find class 'android.support.v4.app.g', referenced from method android.support.v4.app.ab.a
My build.gradle (Module:app) 我的build.gradle(模块:app)
apply plugin: 'com.android.application'
android {
compileSdkVersion 24
buildToolsVersion "25.0.0"
defaultConfig {
applicationId "com.dahlstore.sosbackground2"
minSdkVersion 15
targetSdkVersion 24
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:24.2.1'
}
As stated in answer above, you should include Service and BroadcastReceiver in manifest. 如上面的答案所述,您应该在清单中包含Service和BroadcastReceiver。 But, you register your BroadCastReceiver dynamically in Service and never unregister it.
但是,您在服务中动态注册BroadCastReceiver,并且永远不会注销它。 If you want to receive notifications all the time, you should register receiver in manifest with corresponding internt filter.
如果您希望始终接收通知,则应在清单中注册接收器并使用相应的internt过滤器。 Or, unregister receiver in onTerminate() method of Service.
或者,在服务的onTerminate()方法中取消注册接收器。
you need to include service and receiver in manifest.....as like that 你需要在清单中包含服务和接收器.....就像那样
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.dahlstore.sosbackground">
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<service android:name=".BackgroundService"/>
<receiver android:name=".ScreenReceiver" >
<intent-filter>
<action android:name="android.intent.action.SCREEN_OFF"/>
<action android:name="android.intent.action.SCREEN_ON"/>
</intent-filter>
</receiver>
</application>
</manifest>
Hey try this Broadcastreceiver....... 嘿试试这个Broadcastreceiver .......
public class ScreenReceiver extends BroadcastReceiver {
private boolean screenOff;
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
Log.i("[BroadcastReceiver]", "MyReceiver");
if(intent.getAction().equals(Intent.ACTION_SCREEN_ON)){
Log.i("[BroadcastReceiver]", "Screen ON");
}
else if(intent.getAction().equals(Intent.ACTION_SCREEN_OFF)){
Log.i("[BroadcastReceiver]", "Screen OFF");
}
Intent i = new Intent(context, BackgroundService.class);
i.putExtra("screen_state", screenOff);
context.startService(i);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.