2015-07-20 2 views
-1

Я просто использовал диспетчер аварийных сигналов, чтобы инициировать широковещательный приемник и этот широковещательный приемник, обращающийся к службе. Весь этот процесс вызывается снова и снова через определенный промежуток времени, как я уже установил в своей службе будильника. Но все же я столкнулся с проблемой, что моя служба убивает через один или два дня на каком-то устройстве Android. Следующий мой код.Почему служба убивает через один или два дня?

Здесь я звоню в эфир.

Intent myIntent = new Intent(NotificationFirstActivity.this, 
       MyReceiver.class); 
     pendingIntent = PendingIntent.getBroadcast(
       NotificationFirstActivity.this, 0, myIntent, 0); 

     AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); 
     alarmManager.set(AlarmManager.RTC, calendar.getTimeInMillis(), 
       pendingIntent); 
     alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, 
       calendar.getTimeInMillis(), 1 * 60 * 1000, pendingIntent); 

И это мой приемник вещания, как описано ниже.

public class MyReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     Intent service1 = new Intent(context, MyAlarmService.class); 
     context.startService(service1); 
     if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) { 
      Intent pushIntent = new Intent(context, MyAlarmService.class); 
      context.startService(pushIntent); 
     } 

    } 

} 

Ниже приведена моя манифестная часть, например.

<service android:name="MyAlarmService" 
       android:enabled="true" /> 

     <receiver android:name="MyReceiver"/> 


     <receiver 
      android:name="com.google.android.gcm.GCMBroadcastReceiver" 
      android:permission="com.google.android.c2dm.permission.SEND" > 
      <intent-filter> 
       <category android:name="android.intent.category.DEFAULT" /> 
       <action android:name="android.intent.action.QUICKBOOT_POWERON"/> 
       <action android:name="com.google.android.c2dm.intent.RECEIVE" /> 
       <action android:name="com.google.android.c2dm.intent.REGISTRATION" /> 
       <action android:name="android.intent.action.BOOT_COMPLETED" /> 
       <category android:name="com.phoenixmanage" /> 
      </intent-filter> 
     </receiver> 
     <service android:name="com.phoenixmanage.GCMIntentService" /> 

ответ

0

Возможны следующие действия. 1) Если устройство выключено и запущено, вы не получите приемник радиопередатчика тревоги. Внесите OnBootReceiver, который получит OnBoot, завершенный, и там вы можете запустить свои ожидающие тревоги, которые не были уволены. ссылка: Android - Alarm doesn`t fire sometimes after long period

2) http://www.learn-android-easily.com/2013/06/scheduling-task-using-alarm-manager.html

+0

Но я уже использовал onbootreceiver в своей трансляции. –

+0

проверьте перезагрузку, вы получите журнал получателя или нет. – NovusMobile

+0

Даже после перезагрузки мой сервис работает, основная проблема заключается в том, что после двух или трех дней сервис автоматически уничтожает. –

2

Это то, что я использовал в одном из моего приложения, работает отлично. я использовал это для публикации данных на сервере каждые 15 мин.

public class BackgroundService extends Service { 

     public static final String ACTION_PING = "com.example.ACTION_PING"; 
     public static final String ACTION_CONNECT = "com.example.ACTION_CONNECT"; 
     public static final String ACTION_SHUT_DOWN ="com.example.ACTION_SHUT_DOWN"; 

     private final static String TAG = "BackgroundService"; 
     static Context context; 
     private static volatile PowerManager.WakeLock lockStatic = null; 

     long INTERVAL =AlarmManager.INTERVAL_FIFTEEN_MINUTES; 

    public static Intent startIntent(Context context) { 
    Intent i = new Intent(context, BackgroundService.class); 
      i.setAction(ACTION_CONNECT); 
      return i; 
    } 

     public static Intent pingIntent(Context context) { 
      Intent i = new Intent(context, BackgroundService.class); 
      i.setAction(ACTION_PING); 
      return i; 
     } 

     public static Intent closeIntent(Context context) { 
      Intent i = new Intent(context, BackgroundService.class); 
      i.setAction(ACTION_SHUT_DOWN); 
      return i; 
     } 

     synchronized private static PowerManager.WakeLock getLock(Context context) { 
      if (lockStatic == null) { 
       PowerManager mgr = (PowerManager) context.getApplicationContext().getSystemService(Context.POWER_SERVICE); 

       lockStatic = mgr.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG); 
       lockStatic.setReferenceCounted(true); 
      } 

      return (lockStatic); 
     } 



     @Override 
     public void onCreate() { 
      super.onCreate(); 
      Log.d(TAG, "onCreate"); 
    context = this; 
     } 

     @Override 
     public void onDestroy() { 
      super.onDestroy(); 
      Log.i(TAG, "onDestroy"); 
     } 

     @Override 
     public void onStart(Intent intent, int startId) { 
      super.onStart(intent, startId); 
      Log.i(TAG, "onStart"); 

     } 

     @Override 
     public int onStartCommand(Intent intent, int flags, int startId) { 
      // Log.i(TAG, "onStartCommand"); 

      PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); 
      PowerManager.WakeLock lock = getLock(this.getApplicationContext()); 

      if (!lock.isHeld()) { 
       lock.acquire(); 
      } 

      if (intent != null) { 
       if (ACTION_SHUT_DOWN.equals(intent.getAction())) { 
        stopSelf(); 
        return super.onStartCommand(intent, flags, startId); 
       } 
      } 

      if (intent == null || (intent.getAction() != null && !intent.getAction().equals(ACTION_SHUT_DOWN))) { 
       AlarmManager am = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 
       PendingIntent operation = PendingIntent.getService(this, 0, 
       BackgroundService.pingIntent(this), 
       PendingIntent.FLAG_NO_CREATE); 
       if (operation == null) { 
       PendingIntent operation = PendingIntent.getService(this, 0, BackgroundService.pingIntent(this), PendingIntent.FLAG_UPDATE_CURRENT); 
       am.setInexactRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), pm.isScreenOn() ? SCREEN_ON_INTERVAL : SCREEN_OFF_INTERVAL, operation); 
       } 
      } 

      //fetch parsms and make your web service call here 

      return START_STICKY; 
     } 

использовать это, чтобы запустить службу

startService(BackgroundService.startIntent(context)); 

использовать это, чтобы прекратить пользование услугой

AlarmManager am = (AlarmManager) 
       context.getSystemService(Context.ALARM_SERVICE); 
       PendingIntent operation = PendingIntent.getService(context, 0, 
       BackgroundService.pingIntent(context), 
       PendingIntent.FLAG_NO_CREATE); 
       if (operation != null) { 
       am.cancel(operation); 
       operation.cancel(); 
       } 
       context.startService(BackgroundService.closeIntent(context)); 

ПРИМЕЧАНИЕ:, если устройство перезагрузки, ваша тревога будет отменена, поэтому, если вы хотите восстановить его, вы должны создать BroadcastReceiver, который прослушивает действие android.intent.action.BOOT_COMPLETED и позволяет вам вызывать вышеуказанный код для настройки повторяющийся сигнал тревоги.

+0

Спасибо тебе столько сорабх, что ты так хорошо помогаешь мне ... –

Смежные вопросы