android 启动或重启

android Boot or Reboot

嗨,我有一个警报管理器,用户可以设置警报,我将其保存到数据库中,以备 phone 重新启动或启动时使用。到目前为止,我写了这篇文章,但它不起作用

public class RestartAlarmsReceiver extends BroadcastReceiver {
private static final String TAG = "alarm";
AlarmManager alarmManager;
Intent mintent;
PendingIntent pendingIntent;
AlarmDbHelper dbHelper;
long time;
@Override
public void onReceive(Context context, Intent intent) {
    if (intent.getAction().equals("android.intent.action.BOOT_COMPLETED")|| intent.getAction().
            equals("android.intent.action.REBOOT")) {

        dbHelper = new AlarmDbHelper(context);
        List<ChildTour> alarms =dbHelper.getAlarms();


        for (int i =0;i<2;i++){
            alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
            mintent = new Intent(context,AlarmReceiver.class);
            ChildTour Child = alarms.get(i);
            mintent.putExtra("name",Child.getTime());
            mintent.putExtra("tourId",Child.getTourId()+"");
            pendingIntent = PendingIntent.getBroadcast(context,Child.getTourId(),mintent,0);
            Calendar calendar = Calendar.getInstance();
            calendar.set(Calendar.HOUR_OF_DAY, Child.getHour());
            calendar.set(Calendar.MINUTE, Child.getMin());

            time=(calendar.getTimeInMillis()-(calendar.getTimeInMillis()%60000));
            if(System.currentTimeMillis()>time)
            {
                if (calendar.AM_PM == 0)
                    time = time + (1000*60*60*12);
                else
                    time = time + (1000*60*60*24);
            }
            alarmManager.set(AlarmManager.RTC_WAKEUP,time, pendingIntent);
            Log.i("alarm","Alarm set With Id : "+Child.getTourId() +"Hour: " +Child.getHour()+"Minute: "+Child.getMin());
        }
}
}

这是我的清单文件,我尝试重新启动并关闭我的 phone,但它不起作用

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>

 <receiver android:name=".AlarmReceiver"/>

    <receiver android:name=".RestartAlarmsReceiver"
        android:enabled="false">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED"/>
            <action android:name="android.intent.action.REBOOT"/>
            <action android:name="android.intent.action.ACTION_POWER_CONNECTED"/>
        </intent-filter>
    </receiver>

我的 alarmReciver class 正在工作

我开始工作了,但这并不容易,而且我认为 tablet/phone 可能需要也可能不需要 root

试试你这样显化:

   <uses-permission android:name="android.permission.WAKE_LOCK" />
<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">
    <service android:name="SendDataService" />
    <receiver
        android:name=".BootReciever">

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

        </intent-filter>
    </receiver>

您需要像这样在清单中添加引导接收器

清单:

<receiver android:name=".OnBootReceiver" >
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED" />
        <uses-permission android:name="android.permission.WAKE_LOCK" />
    </intent-filter>
</receiver>

然后像这样创建引导接收器 class...

接收方:

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

public class OnBootReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context ctxt, Intent intent) {
AlarmHelper.setAlarm(ctxt);
}
}

我的闹钟助手 class 是一个像这样的简单的一天开始闹钟...

闹钟助手class:

public class AlarmHelper {

public static void testAlarm(Context context) {
Calendar when = Calendar.getInstance();
when.add(Calendar.SECOND, 10);
setAlarm(context, when);    
}

public static void setAlarm(Context context) {
Calendar when = Calendar.getInstance();
when.add(Calendar.DAY_OF_YEAR, 1);
when.set(Calendar.HOUR_OF_DAY, 0);
when.set(Calendar.MINUTE, 0);
when.set(Calendar.SECOND, 0);
setAlarm(context, when);
}

    @SuppressLint("SimpleDateFormat")
private static void setAlarm(Context context, Calendar when) {

SharedPreferences prefs = PreferenceManager
.getDefaultSharedPreferences(context.getApplicationContext());

Boolean showNotifications = prefs.getBoolean("PREF_SHOW_NOTIFICATIONS",
false);

if (showNotifications) {    
AlarmManager am = (AlarmManager) context
.getSystemService(Context.ALARM_SERVICE);

am.setRepeating(AlarmManager.RTC_WAKEUP, when.getTimeInMillis(), AlarmManager.INTERVAL_DAY, getPendingIntent(context.getApplicationContext()));

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

Log.i(TAG, "Alarm set " + sdf.format(when.getTime()));
}
}

您的 Manifest 操作应该类似于 .

 <receiver
        android:name=".receivers.BootCompleteReceiver"
        android:enabled="true"
        android:exported="true">
        <intent-filter android:priority="1000">
            <category android:name="android.intent.category.DEFAULT"/>
            <action android:name="android.intent.action.BOOT_COMPLETED"/>
            <action android:name="android.intent.action.QUICKBOOT_POWERON"/>
            <action android:name="com.htc.intent.action.QUICKBOOT_POWERON"/>
            <action android:name="android.intent.action.REBOOT"/>
        </intent-filter>
    </receiver>

正如我上面所述,自动启动 选项可能是无法获得重启广播的问题。因此,请使用其他一些设备进行测试 too.If 该设备具有自动启动功能,然后为您的应用程序启用它。设置 > 权限 > 自动启动。这只能手动访问,即没有 API 以编程方式更改 enable/disable 它。您可以查看这些链接了解更多 Link1, /