【问题标题】:Android Alarm Manager not triggering eventAndroid 警报管理器未触发事件
【发布时间】:2015-03-30 12:50:51
【问题描述】:

我正在尝试设置 3 个特定时间的闹钟,并且每天都会重复。

我有 2 个 Arraylist,一个保存 pendingIntent,另一个保存日历时间。

ArrayList<PendingIntent>intentarray = new ArrayList<PendingIntent>();
ArrayList<Calendar>calTimes = new ArrayList<Calendar>();

我设置了以下时间

    Calendar cal = Calendar.getInstance();
    Calendar cal1 = Calendar.getInstance();
    Calendar cal2 = Calendar.getInstance();

    cal.setTimeInMillis(System.currentTimeMillis());
    cal.set(Calendar.HOUR_OF_DAY,9);
    cal.set(Calendar.MINUTE,00);
    calTimes.add(cal);

    cal1.setTimeInMillis(System.currentTimeMillis());
    cal1.set(Calendar.HOUR_OF_DAY,15);
    cal1.set(Calendar.MINUTE,00);
    calTimes.add(cal1);

    cal2.setTimeInMillis(System.currentTimeMillis());
    cal2.set(Calendar.HOUR_OF_DAY,21);
    cal2.set(Calendar.MINUTE,00);
    calTimes.add(cal2);

后跟一个数组来保存 AlarmManagers

AlarmManager[] alarmManager=new AlarmManager[3];

然后在一个循环中,我将每个警报分配给警报管理器。

for(int i =0; i < calTimes.size(); i++){

        Intent alarmIntent = new Intent(this,AlarmReceiver.class);
        pendingIntent = pendingIntent.getBroadcast(this,i,alarmIntent,0);

        alarmManager[i] = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
        alarmManager[i].setInexactRepeating(AlarmManager.RTC_WAKEUP,calTimes.get(i).getTimeInMillis(),AlarmManager.INTERVAL_DAY,alarmIntent);

        intentarray.add(pendingIntent);
    }

`

当我运行应用程序并更改触发警报的时间时。什么都没发生。

这是我的广播接收器。

public class AlarmReceiver extends BroadcastReceiver{

    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context,"starting App",Toast.LENGTH_LONG).show();
        startApp(context,"com.example.myapp");
    }

    public void startApp(Context context, String packageName){
        Intent intent = context.getPackageManager().getLaunchIntentForPackage(packageName);
        if (intent != null){
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startActivity(intent);
        }
    }
}

【问题讨论】:

  • 您是否在清单中添加了&lt;receiver android:name=".AlarmReceiver"/&gt;

标签: android android-intent alarmmanager android-pendingintent android-broadcast


【解决方案1】:

您正在将Intent 添加到AlarmManager。您需要添加PendingIntent

替换

alarmManager[i].setInexactRepeating(AlarmManager.RTC_WAKEUP,calTimes.get(i).getTimeInMillis(),AlarmManager.INTERVAL_DAY,alarmIntent);

alarmManager[i].setInexactRepeating(AlarmManager.RTC_WAKEUP,calTimes.get(i).getTimeInMillis(),AlarmManager.INTERVAL_DAY,pendingIntent);

另一件事:您不需要使用AlarmManager 对象数组来添加重复警报。 AlarmManager 的单个实例就可以了。

【讨论】:

  • 使用Intent 代替PendingIntent 绝对是错误的。
  • @Zygotelnit,我将 Intent 更改为 PendingIntent,但问题仍然存在。根本没有触发警报。
【解决方案2】:

如果你想设置多个闹钟,你必须为你的意图赋予不同的id(否则新的闹钟会替换之前的闹钟)。

for(int i =0; i < calTimes.size(); i++){

    Intent alarmIntent = new Intent(this,AlarmReceiver.class);
    intent.setData(Uri.parse("timer:" + i));
    pendingIntent = pendingIntent.getBroadcast(this,i,alarmIntent,0);

    alarmManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
    alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP,calTimes.get(i).getTimeInMillis(),AlarmManager.INTERVAL_DAY,alarmIntent);

    intentarray.add(pendingIntent);
}

【讨论】:

    【解决方案3】:

    这行得通:

    AlarmManager alarmManager;
    
    
    alarmManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
    
    
     private void alarms(){
    
            ArrayList<Integer> intentarray = new ArrayList<>();
            ArrayList<Calendar> calTimes = new ArrayList<>();
    
            Calendar cal = Calendar.getInstance();
            Calendar cal1 = Calendar.getInstance();
            Calendar cal2 = Calendar.getInstance();
    
            cal.setTimeInMillis(System.currentTimeMillis());
            cal.set(Calendar.HOUR_OF_DAY, 9);
            cal.set(Calendar.MINUTE, 00);
            calTimes.add(cal);
    
            cal1.setTimeInMillis(System.currentTimeMillis());
            cal1.set(Calendar.HOUR_OF_DAY, 15);
            cal1.set(Calendar.MINUTE, 00);
            calTimes.add(cal1);
    
            cal2.setTimeInMillis(System.currentTimeMillis());
            cal2.set(Calendar.HOUR_OF_DAY, 21);
            cal2.set(Calendar.MINUTE,00);
            calTimes.add(cal2);
    
    
            Intent alarmIntent = new Intent(this, AlarmReceiver.class);
    
            for(int i = 0; i < calTimes.size(); i++){
    
                PendingIntent pendingIntent = PendingIntent.getBroadcast(this, i, alarmIntent,0);
    
                //Wake up the device to fire the alarm at approximately
                alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, calTimes.get(i).getTimeInMillis(),AlarmManager.INTERVAL_DAY, pendingIntent);
                intentarray.add(i);
            }
        }
    

    已编辑:

    如果你需要在不使用 startActivity 的情况下唤醒你的 Activity,你需要这样的东西:

    <uses-permission android:name="android.permission.WAKE_LOCK"/>
    
    
    import android.content.Context;
    import android.content.Intent;
    import android.os.PowerManager;
    import android.support.v4.content.WakefulBroadcastReceiver;
    import android.widget.Toast;
    
    public class AlarmReceiver extends WakefulBroadcastReceiver {
    
        public static PowerManager.WakeLock wakeLock;
    
        public AlarmReceiver() {
        }
    
        @Override
        public void onReceive(Context context, Intent intent) {
    
            PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
            wakeLock = pm.newWakeLock((PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP), "TAG");
            wakeLock.acquire();
    
            Toast.makeText(context, "starting App", Toast.LENGTH_LONG).show();
            startApp(context,"com.example.myapp");
    
            wakeLock.release();
        }
    
        public void startApp(Context context, String packageName){
    
            Intent intent = context.getPackageManager().getLaunchIntentForPackage(packageName);
    
            if (intent != null){
                intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                context.startActivity(intent);
            }
        }
    }
    

    【讨论】:

    • 它仍然无法正常工作,此时我不确定发生了什么。我开始了一个新项目并使用了您发布的代码。还是一样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多