我迫切需要帮助解决我的问题。
我有一个简单的 BroadcastReciever
,可以检测我的屏幕何时关闭和 。我正在使用 Service
而不是 Activity
。我已尝试在Android 4.4.2 API 19
和Android 6.0 API 23
上运行该服务。
有人可以告诉我我做错了吗?
此外,根据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;
}
我的BroadCastReciever
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>
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)
根据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
我的build.gradle(模块:应用)
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'
}
答案 0 :(得分:2)
如上面的答案中所述,您应该在清单中包含Service和BroadcastReceiver。但是,您在服务中动态注册BroadCastReceiver,并且永远不会注销它。 如果您希望始终接收通知,则应在清单中注册接收器并使用相应的internt过滤器。 或者,在服务的onTerminate()方法中取消注册接收器。
答案 1 :(得分:1)
你需要在清单中包含服务和接收器.....就像那样
<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 .......
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);
}
}