Android 广播接收器用于检测屏幕开/关和服务不工作

Android 广播接收器用于检测屏幕开/关和服务不工作,android,android-intent,broadcastreceiver,android-gradle-plugin,android-service,Android,Android Intent,Broadcastreceiver,Android Gradle Plugin,Android Service,我有一个简单的BroadcastReceiver,它可以检测屏幕何时关闭和打开。我正在使用服务而不是活动。我试过在安卓4.4.2API19上运行该服务,也试过在安卓6.0API23上运行该服务 我做错了什么 另外,根据StackOverflow的许多回答,您不应该在AndroidManifest中添加服务 public class BackgroundService extends Service { @Override public void onCreate() { super.o

我有一个简单的
BroadcastReceiver
,它可以检测屏幕何时关闭和打开。我正在使用
服务
而不是
活动
。我试过在安卓4.4.2API19上运行该服务,也试过在安卓6.0API23上运行该服务

我做错了什么

另外,根据StackOverflow的许多回答,您不应该在
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;
}
我的广播接收器

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);
  }
}
我的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>
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)
根据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(模块:应用程序)


您需要在清单中包括服务和接收者……就像这样

<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>

如上所述,您应该在清单中包括服务和广播接收者。但是,您可以在服务中动态注册您的BroadCastReceiver,并且从不注销它。 如果您想一直接收通知,您应该使用相应的internt筛选器在清单中注册接收者。
或者,在onTerminate()服务方法中注销接收器。

非常感谢!根据你的建议,我现在已经更改了问题中的代码,但是它仍然抛出了一个异常,正如你从新的logcat中看到的那样..感谢上帝!现在我得到了一个更合理的日志。。我会设法弄清楚我应该在哪里使用悬挂式帐篷。。或者你现在已经开始了?我知道你已经做了自己的项目来帮助我了,非常感谢!不幸的是,它既不能在我的模拟器上工作,也不能在我的S7 Edge(Android 6.0.1)上工作,也不能在我的未知品牌手机(Android 4.4.2)上工作。我正在再次上传最新的日志。。我不确定这是否是我使用Android Studio造成的。也许我应该下载并尝试Eclipse。既然你有一个项目的工作实例,你能把它寄给我吗?我想我现在知道问题了。当我多次锁定/解锁屏幕时,会出现以下错误:E/KeyguardUpdateMonitor:Object试图添加另一个回调java.lang.Exception:Called by您认为keyguard试图阻止我让接收器工作吗?好的,因此,my IntentFilter filter=新建IntentFilter(Intent.ACTION\u SCREEN\u ON);不做同样的工作?这个问题认为您不应该在清单中使用它。您可以在清单中使用它,或者在服务启动时动态注册和注销广播接收器(仅当服务运行时才会收到通知),如果您希望始终接收事件,无论您的服务是否正在运行,在清单中声明接收者,否则动态注册和注销它。这里是教程:我在一些问题中读到,
SCREEN\u OFF
是一个受保护的广播,广播接收器需要动态注册它,而不是在清单中。你能解决这个问题吗?
<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>
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);
    }
  }