2016-06-28 2 views
0

У меня есть следующий проект в моем приложении: у меня есть одно действие, которое устанавливает повторяющийся сигнал тревоги, который запускает приемник, который начинает мое обслуживание. Каждую минуту. В моем сервисе я установил Start Sticky, но как только Android решит убить мой сервис, я не могу его перезапустить. Это Android 4.4.2 Не могли бы вы мне помочь? Вот мой код:Регенерирующий дизайн обслуживания android

public class MainActivity extends AppCompatActivity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE); 
    Intent i1 = new Intent(MainActivity.this, AlarmReceiver.class); 
    PendingIntent pi = PendingIntent.getBroadcast(MainActivity.this, 0, i1, PendingIntent.FLAG_UPDATE_CURRENT); 
    am.setRepeating(AlarmManager.RTC_WAKEUP, 0, 60 * 1000, pi); 
} 

здесь приемник

public void onReceive(Context arg0, Intent arg1) { 
    // For our recurring task, we'll just display a message 
    Log.d(Constants.TAG, "Starting Service"); 
    Intent intent = new Intent(arg0, MyLocationService.class); 
    arg0.startService(intent); 
} 

и обслуживание:

private static PowerManager.WakeLock wl; 
private static OkHttpClient client; 
@Nullable 
@Override 
public IBinder onBind(Intent intent) { 
    return null; 
} 

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    Log.d(Constants.TAG, "Service onStartCommand"); 
    PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); 
    wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, Constants.TAG); 
    wl.acquire(); 
    client = new OkHttpClient(); 
    new GetLocation(MyLocationService.this).execute(); 
    return START_STICKY; 
} 

какие-либо идеи, как решить эту проблему?

ответ

0

Вы, скорее всего, видите взаимодействие с управлением питанием и сигнализациями. Начиная с API 19 все сигналы тревоги недействительны по умолчанию, поэтому они будут сопоставлены с другими аварийными сигналами. Кроме того, после того, как устройство вступит в более низкое состояние питания, сигналы тревоги доставляются до BroadcastReceiver с, и устройство гарантированно не встает, пока приемник выполняет свой метод onReceive(). После того, как он вернется из этого метода (и любого другого BroadcastReceiver, связанного с прогоном сигнализации), устройство снова перейдет в состояние с низким энергопотреблением. Поскольку ваше приложение ранее было убито, Service больше не работает и не получит процессорное время.

Способом разрешения этого вопроса является использование WakefulReceiver, который принимает wakelock при его запуске onReceive(), начинает ваш Service для обработки. Затем Service освободит wakelock, когда будет завершена обработка. Эта статья предоставит вам хорошее объяснение этому: http://po.st/7UpipA

Обратите внимание, что просыпаться каждую минуту серьезно ухудшает срок службы батареи, поэтому вам следует подумать об этом.

+0

спасибо. Но, я думаю, я решил это с помощью AlarmManager.setExact(), поэтому я устанавливал будильник каждый раз, когда моя служба запускается в OnStartCommand. – Traabefi

+0

. Вы все равно столкнетесь с проблемами управления питанием, если вы не управляете своими wakelocks, как описано. –

+0

Есть ли разница между приобретением wakelock в самом сервисе и BroadcastReceiver? – Traabefi

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