1

Я пытаюсь создать будильник после 10 минут запуска приложения. Согласно моему требованию, этот сигнал тревоги должен работать, закрывает ли пользователь приложение, выключается и включается снова или даже после перезапуска. Ниже мой код.Android: срабатывание сигнализации до запланированного времени

MainActivity.java

import android.app.ActivityManager; 
import android.app.Application; 
import android.content.Context; 
import android.content.Intent; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.View; 

import java.util.List; 

public class MainActivity extends AppCompatActivity { 

    private Context context; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     this.context=this; 

     startService(new Intent(getBaseContext(), MyService.class)); 

    } 

    public void startService(View view) { 
     // startService(new Intent(getBaseContext(), MyService.class)); 
    } 

    // Method to stop the service 
    public void stopService(View view) { 
     // stopService(new Intent(getBaseContext(), MyService.class)); 
    } 

} 

MyService.java - Это класс обслуживания.

import android.app.AlarmManager; 
import android.app.IntentService; 
import android.app.PendingIntent; 
import android.app.Service; 
import android.content.ComponentName; 
import android.content.Intent; 
import android.content.pm.PackageManager; 
import android.os.IBinder; 
import android.os.SystemClock; 
import android.widget.Toast; 

import java.io.BufferedReader; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.util.Calendar; 
import java.util.GregorianCalendar; 

/** 
* Created by Nirodha Mihiran on 6/8/2016. 
*/ 
public class MyService extends Service { 

    public static boolean doneCreted = false; 

    @Override 
    public IBinder onBind(Intent arg0) { 
     return null; 
    } 


    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     // Let it continue running until it is stopped. 

     Toast.makeText(this, "Service Started Second", Toast.LENGTH_LONG).show(); 

     Calendar calendar = new GregorianCalendar(); 
     calendar.setTimeInMillis(System.currentTimeMillis() + 10 * 60 * 1000); 

     intent = new Intent(MyService.this, AlarmReceiver.class); 
     PendingIntent pendingIntent = PendingIntent.getBroadcast(MyService.this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); 
     AlarmManager am = (AlarmManager) MyService.this.getSystemService(MyService.this.ALARM_SERVICE); 
     // am.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 1000 * 60 * 5, pendingIntent); 
     // am.setWindow(AlarmManager.RTC_WAKEUP,calendar.getTimeInMillis(), 1000 * 60 * 5 , pendingIntent); 
     am.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent); 

     return START_STICKY; 
    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     Toast.makeText(this, "Service Destroyed", Toast.LENGTH_LONG).show(); 
    } 

} 

AlarmReciever.java

import android.app.NotificationManager; 
import android.app.PendingIntent; 
import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.media.RingtoneManager; 
import android.net.Uri; 
import android.support.v4.app.NotificationCompat; 
import android.widget.Toast; 

import java.io.File; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.util.Calendar; 
import java.util.GregorianCalendar; 

/** 
* Created by thisararanawaka on 6/2/16. 
*/ 
public class AlarmReceiver extends BroadcastReceiver { 
    private int MID = 0; 

    public static boolean isCreated; 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     // TODO Auto-generated method stub 

     long when = System.currentTimeMillis(); 

     Calendar calendar = new GregorianCalendar(); 
     calendar.setTimeInMillis(System.currentTimeMillis()+5*60*1000); 

     NotificationManager notificationManager = (NotificationManager) context 
       .getSystemService(Context.NOTIFICATION_SERVICE); 

     Intent notificationIntent = new Intent(context, MainActivity.class); 
     notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 

     PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, 
       notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT); 

     Uri alarmSound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); 

     NotificationCompat.Builder mNotifyBuilder = new NotificationCompat.Builder(
       context).setSmallIcon(R.mipmap.ic_launcher) 
       .setContentTitle("Alaram Fired") 
       .setContentText("Events To be Performed").setSound(alarmSound) 
       .setAutoCancel(true) 
       .setContentIntent(pendingIntent) 

       .setVibrate(new long[]{1000, 1000, 1000, 1000, 1000}); 
     notificationManager.notify(MID, mNotifyBuilder.build()); 
     MID++; 

     Toast.makeText(context, "Notification Created .", Toast.LENGTH_LONG).show(); 
    } 
} 

У меня нет никаких проблем в получении сигнала тревоги на время, если я не выключить и отключить телефон или перезагрузить телефон. Я получаю будильник вовремя.

Однако, если я выключу и включу телефон, или если я перезапущу телефон, я получаю будильник и уведомление сразу после включения/перезапуска телефона - возможно, через одну минуту. В этом случае, даже если будильник запланирован на завтра, это не имеет значения, я получаю его, как только телефон включается/перезапускается.

Что я сделал не так?

+0

Аварийный менеджер сбрасывает телефон во время перезапуска. См. Решение для этого по адресу http://stackoverflow.com/a/38093353/2435238 – sJy

+0

@sJy: у этого решения есть проблемы, он не работает, когда телефон выключен и включен. Тревога после перезапуска также не гарантируется. – Barrier

+0

Это решение показывает, как поймать событие «Полная загрузка» из нашего приложения. Затем для установки сигнала тревоги нам нужно добавить код в onReceive() – sJy

ответ

2

Глядя в код, это может быть причиной

В вашем onStartCommand(), вы устанавливаете время как calendar.setTimeInMillis(System.currentTimeMillis() + 10 * 60 * 1000);

который устанавливает календарное время + 10 минут, а затем вы устанавливая в то же время в строке ниже am.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);

Try, как это,

long myAlarmTime = System.currentTimeMillis() + 10 * 60 * 1000; am.set(AlarmManager.RTC_WAKEUP, myAlarmTime, pendingIntent);

Причина, почему сталкиваются с этой проблемой при перезапуске

Есть две причины, по которым услуга может быть запущена системой. Если кто-то вызывает Context.startService(), тогда система будет получать сервис (создавая его и вызывая его метод onCreate(), если это необходимо), а затем вызывает его метод onStartCommand (Intent, int, int) с аргументами, предоставленными клиентом. Служба в этот момент продолжит работу до вызова Context.stopService() или stopSelf(). https://developer.android.com/reference/android/app/Service.html

+0

Я сделал ваше предположение, но это не сработало. – Barrier