2015-01-12 4 views
0

Я извиняюсь заранее, если не умею писать на английском. Я пишу простое приложение-приложение, напоминающее мне тревогу в определенное время.Wake Lock не работает должным образом

Ниже я установить будильник с AlarmManager:

private static void setAlarm(Context context, Calendar calendar, 
     PendingIntent pIntent) { 
    AlarmManager alarmManager = (AlarmManager) context 
     .getSystemService(Context.ALARM_SERVICE); 
    if (android.os.Build.VERSION.SDK_INT >= 
      android.os.Build.VERSION_CODES.KITKAT) { 
     alarmManager.setExact(AlarmManager.RTC_WAKEUP, 
      calendar.getTimeInMillis(), pIntent); 
    } else { 
     alarmManager.set(AlarmManager.RTC_WAKEUP, 
      calendar.getTimeInMillis(), pIntent); 
    } 
} 

, а затем AlarmManagerHelper:

public class AlarmManagerHelper extends BroadcastReceiver { 

    public void onReceive(Context context, Intent intent) { 
     String title = intent.getStringExtra("Title"); 
     int hour = intent.getIntExtra("Hour", 0); 
     int min = intent.getIntExtra("Minute", 0); 
     String alarmTone = intent.getStringExtra("AlarmTone"); 
     Intent i = new Intent(); 
     i.setClassName("com.example.tasks", 
      "com.example.tasks.AlarmScreenActivity"); 
     i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     i.putExtra("Title", title); 
     i.putExtra("Hour", hour); 
     i.putExtra("Minute", min); 
     i.putExtra("AlarmTone", alarmTone); 
     context.startActivity(i); 
    } 
} 

и AlarmScreenActivity является:

public class AlarmScreenActivity extends Activity { 

    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     // get intent 
     pm = (PowerManager) getSystemService(Context.POWER_SERVICE); 
     wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "My Tag"); 
     wl.acquire(); 
     mPlayer = new MediaPlayer(); 
     try { 
      if (task_Tone != null && !task_Tone.equals("")) { 
       android.net.Uri toneUri = android.net.Uri.parse(task_Tone); 
       if (toneUri != null) { 
        mPlayer.setDataSource(this, toneUri); 
        mPlayer.setAudioStreamType(AudioManager.STREAM_ALARM); 
        mPlayer.setLooping(true); 
        mPlayer.prepare(); 
        mPlayer.start(); 
       } 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    // some code 
    public void onClickDissmis(View view) { 
     mPlayer.stop(); 
     finish(); 
    } 

    protected void onDestroy() { 
     super.onDestroy(); 
     wl.release(); 
    } 
} 

затем с AlarmManagerHelper и AlarmScreenActivity его отображения.

моя проблема: в определенное время, которое должно просыпаться и звонить не делать int, поэтому, когда я нажимаю кнопку питания, экран поворота на этом работает ???! (когда он находится в режиме отладки, и устройство, подключенное к системе, работает нормально) Надеюсь, что это очень хорошо описывает мою проблему.

ответ

0

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

+0

спасибо от вашего ответа ... в OnClick в кнопке в этом AlarmScreenActivity, как это: «общественные пустоты onClickDissmis (View Вид) { \t \t mPlayer.stop(); \t \t отделка(); \t \t \t} «Я думаю, что я должен поставить ниже код – AsmA

+0

Я отредактировал мое сообщение ... надеюсь, что это описано лучше ... извините за это. – AsmA

0

В то время как AlarmManagerHelper.onReceive работает, система удерживает блокировку (из-за диспетчера сигналов тревоги), которая не сработает. Но между context.startActivity(i); и началом активности система снова засыпает. Вам нужно либо использовать WakefulBroadcastReceiver (см. BroadcastReceiver Vs WakefulBroadcastReceiver), либо (это то, что я использую) WakefulIntentService.

В любом случае вам необходимо запустить сервис и начать свою деятельность. Для шаблона WakefulIntentService см. Мой ответ PowerManager.PARTIAL_WAKE_LOCK android и ссылки там.