一段时间后从后台启动 activity

start an activity from background after a while

我正在开发一个需要在收到 FCM 消息时启动 activity 的应用程序。 一切正常,但只要我暂时不使用 phone 并且 phone 进入睡眠模式并且 activity 不会启动。如何防止我的应用进入休眠状态并强制它一直处于后台?

我实际上想要 运行 调用 activity 就像 WhatsApp 使用的那样。 我已将以下权限添加到清单文件:

<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="android.webkit.PermissionRequest" />
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />

 <activity
        android:name=".RingingActivity"
        android:excludeFromRecents="true"
        android:noHistory="true"
        android:screenOrientation="sensorPortrait"
        android:showOnLockScreen="true"
        android:showWhenLocked="true"
        android:theme="@style/AppTheme.NoActionBar"
        android:turnScreenOn="true" />

并且我在 setContentView

之前将以下代码添加到我的 RingingActivity
 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        setShowWhenLocked(true);
        setTurnScreenOn(true);
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
        KeyguardManager keyguardManager = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);
        if (keyguardManager != null)
            keyguardManager.requestDismissKeyguard(RingingActivity.this, null);
    } else {
        getWindow().setFlags(
                WindowManager.LayoutParams.FLAG_FULLSCREEN | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
                        | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON,
                WindowManager.LayoutParams.FLAG_FULLSCREEN | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
                        | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
    }

收到FCM消息后,我开始activity如下

public void onMessageReceived(RemoteMessage message){
\...
Intent ringing_intent = new Intent(getApplicationContext(), RingingActivity.class);
ringing_intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_NO_USER_ACTION);
startActivity(ringing_intent);
}

我还使用 AlarmManager

启动了 activity
am =(AlarmManager)getApplicationContext().getSystemService(Context.ALARM_SERVICE);
        pendingIntent = PendingIntent.getActivity(this,
                12345, ringing_intent, PendingIntent.FLAG_CANCEL_CURRENT);
        am.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 100, pendingIntent);

在这两种方法中,activity 越过锁定并开始 运行ning,但过了一会儿它就不再工作了。

p.n。 我还从 phone 设置中的睡眠应用程序中手动删除了我的应用程序。但没有用。

我通过设置优先级解决了我的问题:FCM 消息上的“高”