Intereting Posts
   

closures应用程序后,Android报警取消

我有一个AlarmManager的问题,我设置了调度重复警报的代码,在运行应用程序后,警报运行良好。 即使我点击主页button(和应用程序暂停),警报仍然在其间隔运行。

问题是如果我打开任务pipe理器并强制closures应用程序,然后警报停止运行。

这是一个正常的行为,有什么办法可以避免这种情况,closures应用程序后保持警报运行?

代码如下 – 该方法由ApplicationContext类onCreate()调用。

private void scheduleAlarm() { if (alarmScheduled == true) { return; } // we only need to schedule once. int alarmInterval = Def.pref(getApplicationContext()).getInt("alarmInterval", 30); final Intent intent = new Intent(getApplicationContext(), CollectorAlarmReceiver.class); final PendingIntent pending = PendingIntent.getBroadcast(getApplicationContext(), 0, intent, 0); AlarmManager alarmMgr = (AlarmManager) getApplicationContext().getSystemService(Context.ALARM_SERVICE); alarmMgr.cancel(pending); // cancel others. alarmMgr.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()+1000, alarmInterval*1000, pending); Def.log(TAG,"scheduleAlarm(): alarm scheduled, interval: "+alarmInterval+" seconds"); alarmScheduled = true; } 

收件人代码:

 public void onReceive(Context context, Intent intent) { Log.i(TAG, "CollectorAlarmReceiver invoked, starting CollectorService in background"); context.startService(new Intent(context, CollectorService.class)); Intent collectorService = new Intent(context,CollectorService.class); collectorService.putExtra("action", CollectorService.ACTION_BACKGROUND_REQUEST_MESSAGES); context.sendBroadcast(collectorService); } 

谢谢!

这是正常的行为。 如果用户自愿强制停止应用,则应该停止。 否则,您正在创build一个类似于应用程序的病毒。

如果你真的想要的话,你可以编写另一个服务来监视你的其他服务是否正在运行,如果服务没有运行,就运行服务。 但这将是另一个应用程序和(你希望)用户不会杀死这个应用程序使用任务pipe理器。

就个人而言,我不会担心。 如果用户停下来,他们想停止它。 不要惹恼用户。

我相信@GSree是错的。 有一个简单的方法来实现这一点。 只需使用自定义操作。 就是这样:

首先定义一个自定义的动作名称,比如:

 public static final String MY_ACTION = "com.sample.myaction" 

然后创build一个BroadcastReceiver:

 public class MyAlarmReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(MY_ACTION)) { // Do something here } } } 

在你的AndroidManifest.xml注册接收器:

 <receiver android:name="com.sample.MyAlarmReceiver"> <intent-filter> <action android:name="com.sample.myaction"/> </intent-filter> </receiver> 

然后,要设置闹钟,请使用以下PendingIntent:

 Intent i = new Intent(MY_ACTION); PendingIntent pi = PendingIntent.getBroadcast(getApplicationContext(), 0, i, 0); 

可能还有其他方法可以做到这一点,但是我尝试了这个解决scheme,即使我强制退出我的应用程序,也会调用BroadcastReceiver。

注意这个解决scheme不需要你创build一个服务。

这是一个正常的行为! 当您的应用程序转到onDestroy()时,闹钟将停止工作。

强制closures应用程序不是closures应用程序的正确方法,可能会给您不正确的行为。

这个问题也可能有一些帮助。

我已经做了几次,但不知道为什么你要分配一个requestCode为0; 我认为给你的报警一个独特的号码将有很大的帮助。

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

在清单文件中。 即使应用程序被杀害,闹钟也能正常工作。

我已经能够做到你所需要的。 即使通过应用程序pipe理器工具中的运行选项卡停止应用程序,该服务也会重新启动。 杀死它的唯一方法是通过应用程序pipe理器中unistall选项旁边的强制停止button。 基本上你直接打电话给服务。 这是我的代码:

 public class TestService extends Service { @Override public int onStartCommand(Intent intent, int flags, int startId) { Toast.makeText(this, "Ejecutando Servicio ...", Toast.LENGTH_SHORT).show(); return Service.START_NOT_STICKY; } @Override public void onCreate() { super.onCreate(); Toast.makeText(this, "Iniciando Servicio ...", Toast.LENGTH_SHORT).show(); } @Override public void onDestroy() { super.onDestroy(); Toast.makeText(this, "Deteniendo Servicio ...", Toast.LENGTH_SHORT).show(); } 

在客户端活动上写下面的代码:

  Calendar cal = Calendar.getInstance(); Intent intent = new Intent(this,TestService.class); PendingIntent pIntent = PendingIntent.getService(this.getApplicationContext(), 0, intent, 0); alarm= (AlarmManager) getSystemService(Context.ALARM_SERVICE); alarm.setRepeating(AlarmManager.RTC_WAKEUP,cal.getTimeInMillis(), 3*1000, pIntent); 

并在清单中声明服务:

  <service android:name="TestService" android:icon="@drawable/ic_launcher" android:label="TestService" > </service>