java为什么我的Alarmmanager在终止我的应用程序后不工作?
我有一个应用程序,它需要每24小时发出一次通知,并且应该开始振动5分钟,直到用户点击通知。当应用程序打开或在后台运行时,它可以正常工作,但是如果我终止应用程序,我会收到一个错误“Notificator stopped working”,并且没有任何通知。我用的是安卓7。我如何解决这个问题
public class MainActivity extends AppCompatActivity {
private int hour = 0;
private int minute = 0;
public static boolean timerIsRunning = false;
public static boolean alarmIsRunning = false;
private boolean minutes_text_good = false;
private boolean hour_text_good = false;
@RequiresApi(api = Build.VERSION_CODES.M)
@Override
@SuppressLint("CommitPrefEdits")
protected void onCreate(Bundle savedInstanceState) {
this.setTitle("Notificator");
super.onCreate(savedInstanceState);
AlarmManagerManager.amm.initContext(getApplicationContext());
SharedPreferences sharedPreferences = getSharedPreferences("preferences", MODE_PRIVATE);
hour = sharedPreferences.getInt("hour", 0);
minute = sharedPreferences.getInt("minute", 0);
timerIsRunning = sharedPreferences.getBoolean("timerIsRunning", false);
if (alarmIsRunning) {
setLayoutStopAlarm();
} else {
setLayoutMain();
}
}
@RequiresApi(api = Build.VERSION_CODES.M)
@Override
protected void onResume() {
if (alarmIsRunning) {
setLayoutStopAlarm();
} else {
setLayoutMain();
}
super.onResume();
}
@Override
protected void onStop() {
super.onStop();
SharedPreferences sharedPreferences = getSharedPreferences("preferences", MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putInt("hour", hour);
editor.putInt("minute", minute);
editor.putBoolean("timerIsRunning", timerIsRunning);
editor.apply();
}
@RequiresApi(api = Build.VERSION_CODES.M)
@SuppressLint("ShortAlarm")
public void startAlarm() {
AlarmManagerManager.amm.startAlarm(hour, minute);
}
private void stopAlarm() {
AlarmManagerManager.amm.stopAlarm();
}
private void stopAlarmAction() {
alarmIsRunning = false;
}
startAlarm()方法由应用程序中的按钮调用
public class AlarmManagerManager {
public AlarmManager am;
private PendingIntent startServicePendingIntent;
@SuppressLint("StaticFieldLeak")
public static AlarmManagerManager amm = new AlarmManagerManager();
public Context context;
public void initContext(Context c){
context = c;
}
@RequiresApi(api = Build.VERSION_CODES.M)
public void startAlarm(int hour, int minute) {
am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Intent startServiceIntent = new Intent(context, BackGroundService.class);
startServicePendingIntent = PendingIntent.getService(context, 0, startServiceIntent, 0);
Calendar cal = Calendar.getInstance();
Calendar currentTime = Calendar.getInstance();
int hoursleft = hour - currentTime.get(Calendar.HOUR_OF_DAY);
if (hoursleft < 0) {
hoursleft = 24 + hoursleft;
}
int minutesleft = minute - currentTime.get(Calendar.MINUTE);
if (minutesleft < 0) {
minutesleft = 60 + minutesleft;
}
int timeInMillis = hoursleft * 3600000 + minutesleft * 60000;
cal.setTimeInMillis(System.currentTimeMillis() + timeInMillis);
am.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), startServicePendingIntent);
}
@RequiresApi(api = Build.VERSION_CODES.M)
public void startAlarm() {
Intent startServiceIntent = new Intent(context, BackGroundService.class);
startServicePendingIntent = PendingIntent.getService(context, 0, startServiceIntent, 0);
Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(System.currentTimeMillis() + 1000 * 60 * 60 * 24);//1000*60*60*24
am.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), startServicePendingIntent);
}
public void stopAlarm() {
try {
am.cancel(startServicePendingIntent);
} catch (NullPointerException ignored) {
}
}
}
public class BackGroundService extends Service {
@RequiresApi(api = Build.VERSION_CODES.M)
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
MainActivity.alarmIsRunning = true;
AlarmManagerManager.amm.startAlarm();
Vibrator v = (Vibrator) getSystemService(MainActivity.VIBRATOR_SERVICE);
makeNotification();
v.vibrate(300000); // 5 min in millis
stopSelf();
return super.onStartCommand(intent, flags, startId);
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
private void makeNotification(){
Intent resultIntent = new Intent(getApplicationContext(), MainActivity2.class);
PendingIntent pendingIntent = PendingIntent.getActivity(getApplicationContext(), 1, resultIntent, PendingIntent.FLAG_UPDATE_CURRENT);
NotificationCompat.Builder builder = new NotificationCompat.Builder(getApplicationContext(), "1");
builder.setSmallIcon(R.drawable.ic_launcher_foreground);
builder.setContentTitle("");
builder.setContentText("Auf die Benachrichtigung tippen um den Alarm zu beenden");
builder.setAutoCancel(true);
builder.setFullScreenIntent(pendingIntent, true);
NotificationManagerCompat managerCompat = NotificationManagerCompat.from(getApplicationContext());
managerCompat.notify(1, builder.build());
}
# 1 楼答案
如果您的意思是
Force Stop
,那么不触发报警是正常的