有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    if i terminate the app

    如果您的意思是Force Stop,那么不触发报警是正常的