【问题标题】:Android AlarmManager disabled after phone reboot手机重启后Android AlarmManager禁用
【发布时间】:2015-04-09 15:01:48
【问题描述】:

很抱歉重新发布相同的问题,但我阅读了有关该问题的所有帖子,并且完全按照他们所说的做了,但我无法让它发挥作用。所以请阅读我的代码并在下面告诉我我做错了什么:

**安排闹钟:**

  public void progr(View v){

    Calendar calendar = Calendar.getInstance();

    //calendar.set(Calendar.DAY_OF_YEAR, 1);
    calendar.set(Calendar.HOUR_OF_DAY, 12); // For 1 PM or 2 PM
    calendar.set(Calendar.MINUTE, 36);
    calendar.set(Calendar.SECOND, 1);
    Long time = calendar.getTimeInMillis();//new GregorianCalendar().getTimeInMillis()+10*1000;


    Intent intentAlarm = new Intent(this, AlarmReciever.class);

    // create the object
    AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);

    //set the alarm for particular time
    alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, time, 5000, PendingIntent.getBroadcast(this, 1, intentAlarm, PendingIntent.FLAG_UPDATE_CURRENT));
    Toast.makeText(this, "Alarm Scheduled for Tommrrow", Toast.LENGTH_LONG).show();


    ComponentName receiver = new ComponentName(context, DeviceBootReceiver.class);
    PackageManager pm = context.getPackageManager();

    pm.setComponentEnabledSetting(receiver,
            PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
            PackageManager.DONT_KILL_APP);

}

Alarmreceiver 扩展广播:

public class AlarmReciever extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent)
{

     {

    NotificationCompat.Builder mBuilder =
            new NotificationCompat.Builder(Main.context)
                    .setLargeIcon(BitmapFactory.decodeResource(Main.context.getResources(), R.mipmap.ic_launcher))
                    .setSmallIcon(R.mipmap.ic_launcher)
                    .setContentTitle("Zall - Notification")
                    .setContentText("Veuillez cliquer pour epargner votre crédit.");

    Intent intentnot = new Intent(Main.context, Main.class);
    intentnot.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    PendingIntent pendingIntent = PendingIntent.getActivity(Main.context, 0, intentnot, 0);

    NotificationManager mNotificationManager =
            (NotificationManager) Main.context.getSystemService(Context.NOTIFICATION_SERVICE);

    int mId = 1234567890;

    Notification mNotification = mBuilder.build();
    mNotification.flags = Notification.FLAG_AUTO_CANCEL;
    mNotification.contentIntent = pendingIntent;
    mNotification.defaults = Notification.DEFAULT_ALL;
    mNotificationManager.notify(mId, mNotification);
    }
}

}

DeviceBootReceiver 在设备启动后重新安排警报

public class DeviceBootReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {
  {
        Calendar calendar = Calendar.getInstance();;

        //calendar.set(Calendar.DAY_OF_YEAR, 1);
        calendar.set(Calendar.HOUR_OF_DAY, 12); // For 1 PM or 2 PM
        calendar.set(Calendar.MINUTE, 27);
        calendar.set(Calendar.SECOND, 1);
        Long time = calendar.getTimeInMillis();//new GregorianCalendar().getTimeInMillis()+10*1000;

        // create an Intent and set the class which will execute when Alarm triggers, here we have
        // given AlarmReciever in the Intent, the onRecieve() method of this class will execute when
        // alarm triggers and
        //we will write the code to send SMS inside onRecieve() method pf Alarmreciever class
        Intent intentAlarm = new Intent(Main.context, AlarmReciever.class);

        // create the object
        AlarmManager alarmManager = (AlarmManager) Main.context.getSystemService(Context.ALARM_SERVICE);

        //set the alarm for particular time
        alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP,time,AlarmManager.INTERVAL_DAY, PendingIntent.getBroadcast(Main.context, 1, intentAlarm, PendingIntent.FLAG_UPDATE_CURRENT));
        Toast.makeText(Main.context, "Alarm Scheduled", Toast.LENGTH_LONG).show();
    }
}

}

清单

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.exercicesextrasapks.onezero.intussd" >



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


<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
        android:name=".Main"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

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



    <receiver  android:name=".AlarmReciever">

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


</application>

【问题讨论】:

  • “我不能让它工作”——请解释一下你的意思。还请使用 adb shell dumpsys alarm 等工具查看您安排了哪些闹钟。
  • (抱歉英语不好)设置闹钟响铃效果很好,我只是想让它在设备重启时也能正常工作
  • 您的DeviceBootReceiver 是否被BOOT_COMPLETED 调用?正如@CommonsWare 在你的command promt.Type 中所说,adb shell dumpsys alarm &gt; alarmLog.txt。这将在当前路径中生成一个文本文件。在该文件中搜索您的包名称并查看您当前的活动警报
  • 对不起,我在真机上进行测试,如果我必须下载命令提示符,我不会这样做
  • 我已经下载了终端模拟器,我得到“无法创建 alarmLog.txt 只读文件系统”

标签: android android-alarms


【解决方案1】:

.DeviceBootReceiver 的接收器应如下所示

<receiver android:name=".DeviceBootReceiver" android:enabled="true" android:exported="true">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED"/>
    </intent-filter>
</receiver> code here

您需要允许您的接收者从您的应用程序之外的事物接收消息。 Read this for more information.

【讨论】:

  • 我看到的唯一另一件事是您可能希望将引导接收器中的标志从 PendingIntent.FLAG_UPDATE_CURRENT 更改为 PendingIntent.FLAG_CANCEL_CURRENT。当您重新启动设备时,任何待处理的意图都会丢失。所以,那时你没有什么可以更新的。
  • 为什么不设置日历的日期部分。 void setInexactRepeating 的第二个参数是“警报应该首先响起的时间(以毫秒为单位)”Source。如果您在当地时间下午 12:27 之后运行您的代码,那么您设置的闹钟应该在过去第一次响起。
  • 仍然无法正常工作....即使替换标志并添加:calendar.set(Calendar.DAY_OF_YEAR, 1);
猜你喜欢
  • 1970-01-01
  • 2012-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多