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, /
嗨,我有一个警报管理器,用户可以设置警报,我将其保存到数据库中,以备 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,