AlarmManager.ELAPSED_REALTIME_WAKEUP 在 android 中究竟做了什么

What does exactly AlarmManager.ELAPSED_REALTIME_WAKEUP do in android

我正在尝试学习 AlarmManager,在 android.I 遇到 doc 以了解 AlarmManager.ELAPSED_REALTIME_WAKEUP 的用法。但是当我在我的应用程序中使用它以及当应用程序 运行,我点击后退按钮以为警报管理器会在此处设置的警报间隔时间后再次调用 activity

alarmMgr.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,
                SystemClock.elapsedRealtime()+10*1000, alarmIntent);

但是没有happens.Please有人解释AlarmManager.ELAPSED_REALTIME_WAKEUP的意思。

MainActivity.java

public class MainActivity extends AppCompatActivity {
    private AlarmManager alarmMgr;
    private PendingIntent alarmIntent;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        alarmMgr = (AlarmManager)this.getSystemService(Context.ALARM_SERVICE);
        Intent intent = new Intent(this, AlarmReceiver.class);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        alarmIntent = PendingIntent.getActivity(this, 0, intent,0);
        Log.d("asd","initialized alarmintent");
        alarmMgr.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,
                SystemClock.elapsedRealtime()+10*1000, alarmIntent);

                        Log.d("asd", "alarm set");
    }
}

AlarmReceiver.java

public class AlarmReceiver extends AppCompatActivity
{
    TextView tv;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.intent_layout);
        Log.d("asd","writing textview");
        tv=(TextView)findViewById(R.id.textview);
        tv.setText("called");
    }
}

我会使用 AlarmManager.RTC_WAKEUP 而不是 AlarmManager.ELAPSED_REALTIME_WAKEUP。这是我如何在最近的应用程序中使用 AlarmManager 的示例:

MainActivity.class:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Intent intent = new Intent(this, AlarmReceiver.class);
    final PendingIntent pendingIntent = PendingIntent.getBroadcast(this,  0, intent, 0);

    mAlarmManager = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE);

    // Cancel any existing service(s)
    mAlarmManager.cancel(pendingIntent);

    // Start service
    long alarmTime = System.currentTimeMillis() + 10000L; // 10 seconds from now
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        mAlarmManager.setAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, alarmTime, pendingIntent);
    } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        mAlarmManager.setExact(AlarmManager.RTC_WAKEUP, alarmTime, pendingIntent);
    } else {
        mAlarmManager.set(AlarmManager.RTC_WAKEUP, alarmTime, pendingIntent);
    }
}

AlarmReceiver.class:

public class AlarmReceiver extends BroadcastReceiver {

    public AlarmReceiver() { }

    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "AlarmService Triggered.", Toast.LENGTH_SHORT).show();
        Log.d(this.getClass().getSimpleName(), "Service triggered");
    }
}

您的 AlarmReceiver class 似乎正在扩展 AppCompatActivity,这将不起作用 - 您需要像我一样扩展 Broadcast Receiver。然后,在 AlarmReceiver 的 onReceive() 函数中,您需要导航到所需的 Activity,如下所示:

Intent newIntent = new Intent(context, NewActivity.class);
context.startActivity(newIntent);

尝试这些更改,看看它们是否有效!

您的代码应该可以正常工作。 确保您已在清单中声明您的 AlarmReceiver activity,例如:

<activity
        android:name=".AlarmReceiver"
        android:label="@string/title_activity_alarm_receiver"
        android:theme="@style/AppTheme.NoActionBar"></activity>