Android:从广播接收器设置闹钟只能工作一次

时间:2015-05-21 15:08:44

标签: android clock alarm

我正在制作一个Android应用程序,用于帮助恢复丢失的手机。该应用程序使用持续运行的服务,当手机接收到文本消息(SMS)时,会触发BroadcastReceiver(已在服务中注册)onReceive()事件。我想要的功能是,即使手机处于静音状态,BroadcastReceiver也能够使手机产生很大的噪音。我能想到的最合理的方法是使用和当前时间一分钟设置的闹钟。

这是我目前在广播接收器中使用的代码:

Calendar c = Calendar.getInstance();
Intent alarmIntent = new Intent(AlarmClock.ACTION_SET_ALARM);
alarmIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
alarmIntent.putExtra(AlarmClock.EXTRA_MESSAGE, "Polo!");
alarmIntent.putExtra(AlarmClock.EXTRA_HOUR, c.get(Calendar.HOUR_OF_DAY));
alarmIntent.putExtra(AlarmClock.EXTRA_MINUTES, c.get(Calendar.MINUTE) + 1);
context.startActivity(alarmIntent);

幸运的是,这段代码有效,但它只能运行一次。但我的意思是,第一次运行此代码时,手机的流量会中断,时钟应用程序会以新的闹钟设置打开。当您再次尝试执行此操作时,会打开时钟应用程序,但不会设置警报。我必须重新启动手机才能让它再次运行。

据我所知,这个问题与时钟应用程序有关,我需要重新启动时钟应用程序以使我的服务正常工作。这是一个非常粗略的解决方案,但我不知道还能做什么。

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

诀窍是开发自己的警报屏幕并在onCreate时重新设置警报。 像那样,你的应用程序将不断响起。

为此: 初始化WakefulBroadcastReceiver

的manifest.xml

<receiver android:name="com.mycompany.myapp.AlarmManagerBroadcastReceiver"></receiver>

AlarmManagerBroadcastReceiver.java

public class AlarmManagerBroadcastReceiver extends WakefulBroadcastReceiver{
    @Override
    public void onReceive(Context context, Intent intent) { 
        Calendar c = Calendar.getInstance();
        Intent alarmIntent = new Intent(context, MyAlarm.class);
        alarmIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        alarmIntent.putExtra(AlarmClock.EXTRA_MESSAGE, "Polo!");
        alarmIntent.putExtra(AlarmClock.EXTRA_HOUR, c.get(Calendar.HOUR_OF_DAY));
        alarmIntent.putExtra(AlarmClock.EXTRA_MINUTES, c.get(Calendar.MINUTE) + 1);
        context.startActivity(alarmIntent);
    }
}

MyAlarm.java:

public class MyAlarm extends Activity{
    @Override
    public void onCreate(Bundle savedInstanceState){
        // doing UI stuff
        AlarmUtil.setAlarm(this);
    }
}

AlarmUtil.java

 public class AlarmUtil {
     @SuppressLint("NewApi")
     public static void setAlarm(Context context){
         AlarmManager am = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
         int requestCode = 1234;
         Intent intent = new Intent(context, AlarmManagerBroadcastReceiver.class);
         PendingIntent pi = PendingIntent.getBroadcast(context, requestCode, intent, PendingIntent.FLAG_CANCEL_CURRENT);

         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT){
            am.setExact(AlarmManager.RTC_WAKEUP, 60 * 1000, pi);    
         }
         else{
            am.set(AlarmManager.RTC_WAKEUP, 60 * 1000, pi);
         }  
   }
}