简体   繁体   English

BroadcastReceiver检测屏幕开/关和服务不工作

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM