应用程序自动启动延迟

delay of application auto-boot

我想在设备打开时延迟应用程序的自动启动。我试图通过使用 Handler、Timer 和 AlarmManager 来做到这一点,但是 happend.Default 在 ACTION_BOOT_COMPLETED 启动应用程序时没有任何效果正常,但是当我尝试使用延迟时,我的应用程序没有自动启动根本。我认为这取决于 BroadcastReciever 的生命周期,但我找不到详细的响应。如果您有任何建议,请留下 it.There 是我的代码:

BroacastReciever.java:

package com.example.micka.iportapp;

public class ActivityRunOnStartup extends BroadcastReceiver {

public SharedPreferences sPref;
private final int DEFAULT_APP_BOOT_DELAY = 100000;
private final boolean AUTO_BOOT_APP_FLAG = false;
public static SharedPreferences.Editor editor;
private int ACTUAL_BOOT_DELAY;




@Override
public void onReceive(final Context context, Intent intent) {

    sPref = context.getSharedPreferences("appPref",Context.MODE_PRIVATE);
    ACTUAL_BOOT_DELAY = sPref.getInt("sPref_delay",DEFAULT_APP_BOOT_DELAY);

    if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) {
        final Intent i = new Intent(context, BroadcastActivity.class);
        i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

        PendingIntent pendingIntent = PendingIntent.getBroadcast(context.getApplicationContext(),PendingIntent.FLAG_ONE_SHOT,i,0);

        AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
        alarmManager.set(AlarmManager.ELAPSED_REALTIME,System.currentTimeMillis()+10000,pendingIntent);

               // context.startActivity(i);





                // Actions to do after 10 seconds

            /*}
        }, 5000);*/

    }
}

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.micka.iportapp">
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <receiver
        android:enabled="true"
        android:exported="true"
        android:name=".ActivityRunOnStartup"
        android:permission="android.permission.RECEIVE_BOOT_COMPLETED">

        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
            <action android:name="android.intent.action.QUICKBOOT_POWERON" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>

    </receiver>
    <activity android:name=".BroadcastActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

</application>

我也试过这个版本:

public class ActivityRunOnStartup extends BroadcastReceiver {

public SharedPreferences sPref;
private final int DEFAULT_APP_BOOT_DELAY = 100000;
private final boolean AUTO_BOOT_APP_FLAG = false;
public static SharedPreferences.Editor editor;
private int ACTUAL_BOOT_DELAY;




@Override
public void onReceive(final Context context, Intent intent) {

    sPref = context.getSharedPreferences("appPref",Context.MODE_PRIVATE);
    ACTUAL_BOOT_DELAY = sPref.getInt("sPref_delay",DEFAULT_APP_BOOT_DELAY);

    if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) {
        final Intent i = new Intent(context, BroadcastActivity.class);
        i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

        Handler handler = new Handler();
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                context.startActivity(i);
            }
        },10000);


    }
}

您正在以错误的方式创建 PendingIntent,要启动 activity,您需要调用 PendingIntent.getActivity 而不是 PendingIntent.getBroadcast:

PendingIntent pendingIntent = PendingIntent.getBroadcast(context.getApplicationContext(),PendingIntent.FLAG_ONE_SHOT,i,0);

应替换为:

PendingIntent pendingIntent = PendingIntent.getActivity(context.getApplicationContext(),PendingIntent.FLAG_ONE_SHOT,i,0);

如果您想开始另一个 BroadcastReceiver

另外一个问题是闹钟时间的设置,我记得不需要加上当前时间:

alarmManager.set(AlarmManager.ELAPSED_REALTIME, 10000, pendingIntent);