2017-01-14 5 views
0

Я пытаюсь настроить будильник, который останется включенным, потому что я хочу, чтобы он ушел через 3 дня, и я знаю, что Android убьет мое приложение до этого.Persistent Alarm

В моей деятельности

private void setAlarm() { 
    //ContactAlarmReceiver contactAlarmReceiver = new ContactAlarmReceiver(); 
    //contactAlarmReceiver.setAlarm(getApplicationContext(), dateInMillis, phonenumberET.getText().toString(), firstnameET.getText().toString()); 
    AlarmManager am = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 
    Intent alarmIntent = new Intent(MyConstants.BROADCAST_ACTION_CONTACT_ALARM); 
    alarmIntent.putExtra("phone", phonenumberET.getText().toString()); 
    alarmIntent.putExtra("name", firstnameET.getText().toString()); 

    PendingIntent pi = PendingIntent.getBroadcast(this, 0, alarmIntent, 0); 
    //am.setAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, timeInMills, pi); 
    if (Build.VERSION.SDK_INT >= 23) { 
     am.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, dateInMillis, pi); 
    } else if (Build.VERSION.SDK_INT >= 19) { 
     am.setExact(AlarmManager.RTC_WAKEUP, dateInMillis, pi); 
    } else { 
     am.set(AlarmManager.RTC_WAKEUP, dateInMillis, pi); 
    } 
    ComponentName component = new ComponentName(this, ContactAlarmReceiver.class); 
    getPackageManager() 
     .setComponentEnabledSetting(component, 
      PackageManager.COMPONENT_ENABLED_STATE_ENABLED, 
      PackageManager.DONT_KILL_APP); 
} 

Manifest:

<receiver 
    android:name=".ContactAlarmReceiver" 
    android:enabled="false"> 
    <intent-filter> 
     <action android:name="com.example.johnbravado.CONTACTALARM" /> 
     <action android:name="com.example.johnbravado.NOTIFLTBTN" /> 
     <action android:name="com.example.johnbravado.NOTIFRTBTN" /> 
    </intent-filter> 
</receiver> 

ContactAlarmReceiver:

@Override 
@Override 
public void onReceive(Context context, Intent intent) { 
    PowerManager powerManager = (PowerManager) context.getSystemService(POWER_SERVICE); 
    PowerManager.WakeLock wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, 
      "com.example.johnbravado.zionwork"); 
    wakeLock.acquire(); 

    final NotificationManager mNotificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); 
    Bundle extras = intent.getExtras(); 
    ComponentName receiver = new ComponentName(context, ContactAlarmReceiver.class); 
    PackageManager pm = context.getPackageManager(); 

    if (intent.getAction().equals(MyConstants.BROADCAST_ACTION_CONTACT_ALARM)) { 
     int count = extras.size(); 
     String num = extras.getString("phone"); 
     String name = extras.getString("name"); 
     sendContactNotification(context, MyConstants.BIG_NOTIFICATION_ID, num, name); 
    } 

    if (intent.getAction().equals(MyConstants.BROADCAST_ACTION_NOTIF_LTBTN)) { 
     sendSMS(context, extras.getString("phone"), extras.getString("msg")); 
     mNotificationManager.cancel(MyConstants.BIG_NOTIFICATION_ID); 
     pm.setComponentEnabledSetting(receiver, 
       PackageManager.COMPONENT_ENABLED_STATE_DISABLED, 
       PackageManager.DONT_KILL_APP); 
    } 

    if (intent.getAction().equals(MyConstants.BROADCAST_ACTION_NOTIF_RTBTN)) { 
     initiatePhone(context, intent.getExtras().getString("phone")); 
     mNotificationManager.cancel(MyConstants.BIG_NOTIFICATION_ID); 
     pm.setComponentEnabledSetting(receiver, 
       PackageManager.COMPONENT_ENABLED_STATE_DISABLED, 
       PackageManager.DONT_KILL_APP); 
    } 
    wakeLock.release(); 
} 

Я никогда не получить уведомление после длительных периодов времени. Например, я установил будильник в 11:00 в течение 3 часов, поэтому, когда я проснусь, я должен увидеть уведомление. Но уведомление не отображается.

+0

'ContactAlarmService' выглядит как' Сервис', но вы используете 'PendingIntent', который отправляет широковещательную рассылку 'PendingIntent.getBroadcast()'. –

+0

Хорошо, что ожидаемое намерение я хочу запустить, когда будильник погаснет, это трансляция. –

+0

Тогда вам нужен класс «BroadcastReceiver» в качестве цели; вероятно, именно «WakefulBroadcastReceiver». Затем запустите свою «Сервис». –

ответ

1

Я хотел бы предложить Вам, что, в первую очередь создать класс, как:

import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.widget.Toast; 

public class AlarmReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 

     if(intent.getAction().equals("startalarm")){ 
     intent = new Intent(context, Your_service.class); 
     context.startService(intent); 

}

} 
} 

Примечание: Если сигнал тревоги должен выполнить сетевую задачу, а затем начать загрузку сервис внутри onRecieve() метод вашего будильника. Затем установите AlarmReceiver класс в намерении.

Intent alarmIntent = new Intent(MyActivity.this, AlarmReceiver.class); 

Возможно, вы выйдете из своей проблемы.

+0

. Скажите, что трансляция должна сохраняться после того, как приложение будет убито? Я начал с того, что он работает до тех пор, пока приложение не будет убито. –

+0

Пожалуйста, посмотрите это сообщение: http: //stackoverflow.com/questions/5916859/how-to-save-alarm-after-app-killing –

+0

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