我尝试在用户按下电源按钮三下时显示通知,即使该应用已关闭且屏幕关闭,它在低于矿石的android上也能正常工作,但对于Oreo,只有在打开该应用并按一下后,它才能正常工作关闭应用程序时的电源按钮,我无法检测到点击。
这是服务
package com.example.dt.powerbutton;
import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.graphics.Color;
import android.os.Binder;
import android.os.Build;
import android.os.IBinder;
import android.util.Log;
import androidx.annotation.RequiresApi;
import androidx.core.app.NotificationCompat;
public class LockService extends Service {
BroadcastReceiver mReceiver;
String CHANNEL_ID = "my_channel_02";
NotificationChannel mChannel;
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
sendNotification();
}
public void sendNotification() {
NotificationCompat.Builder mBuilder =
new NotificationCompat.Builder(getApplicationContext())
.setSmallIcon(R.drawable.ic_launcher_foreground)
.setContentTitle("notification")
.setContentText("service in back!");
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
mChannel = new NotificationChannel(CHANNEL_ID, "Notification Channel", NotificationManager.IMPORTANCE_HIGH);
mBuilder.setChannelId(CHANNEL_ID);
}
NotificationManager mNotificationManager =
(NotificationManager) getApplicationContext().getSystemService(Context.NOTIFICATION_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
mNotificationManager.createNotificationChannel(mChannel);
}
startForeground(3, mBuilder.build());
// mNotificationManager.notify(3, mBuilder.build());
}
// @Override
// public void onStart(Intent intent, int startid) {
// final IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON);
// filter.addAction(Intent.ACTION_SCREEN_OFF);
// filter.addAction(Intent.ACTION_USER_PRESENT);
// mReceiver = new ScreenReceiver();
// registerReceiver(mReceiver, filter);
// Log.d("Anis", "hi man it's service");
// }
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
final IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON);
filter.addAction(Intent.ACTION_SCREEN_OFF);
filter.addAction(Intent.ACTION_USER_PRESENT);
final BroadcastReceiver mReceiver = new ScreenReceiver();
registerReceiver(mReceiver, filter);
Log.d("Aniss", filter.getAction(0)+" "+filter.getAction(0));
return super.onStartCommand(intent, flags, startId);
}
public class LocalBinder extends Binder {
LockService getService() {
return LockService.this;
}
}
@Override
public void onDestroy() {
Intent intent = new Intent(this, LockService.class);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
this.startForegroundService(intent);
} else {
this.startService(intent);
}
Log.d("Anis", "onDestroy");
}
}
接收者
package com.example.dt.powerbutton;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Build;
import android.util.Log;
import android.view.View;
import androidx.core.app.NotificationCompat;
public class ScreenReceiver extends BroadcastReceiver {
public static boolean wasScreenOn = true;
public static int Counter = 0;
String CHANNEL_ID = "my_channel_01";
NotificationChannel mChannel;
@Override
public void onReceive(final Context context, final Intent intent) {
Log.e("LOB","onReceive");
if (Counter>=4){
Counter=0;
Log.d("Aniss", "Hi Man ");
sendNotification(context);
} if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
Counter++;
// do whatever you need to do here
wasScreenOn = false;
Log.e("LOB","wasScreenOn"+wasScreenOn);
} else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) {
Counter++;
// and do whatever you need to do here
wasScreenOn = true;
}
}
public void sendNotification(Context context) {
NotificationCompat.Builder mBuilder =
new NotificationCompat.Builder(context)
.setSmallIcon(R.drawable.ic_launcher_foreground)
.setContentTitle("My notification")
.setContentText("Hello World!");
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
mChannel = new NotificationChannel(CHANNEL_ID, "Notification Channel", NotificationManager.IMPORTANCE_HIGH);
mBuilder.setChannelId(CHANNEL_ID);
}
NotificationManager mNotificationManager =
(NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
mNotificationManager.createNotificationChannel(mChannel);
}
mNotificationManager.notify(1, mBuilder.build());
}
}
主要活动
if (!isMyServiceRunning(LockService.class)) {
// Intent intent = new Intent(getApplicationContext(), LockService.class);
// this.startService(intent);
Intent intent = new Intent(this, LockService.class);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
this.startForegroundService(intent);
} else {
this.startService(intent);
}
}
private boolean isMyServiceRunning(Class<?> serviceClass) {
ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
for (ActivityManager.RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
if (serviceClass.getName().equals(service.service.getClassName())) {
return true;
}
}
return false;
}