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

その解決方法は、アプリからBoot completeイベントをキャッチする方法を示しています。次に、アラームを設定するためにonReceive()にコードを追加する必要があります – sJy

答えて

2

あなたのコードを調べて、これは)あなたのonStartCommandで

理由(可能性があり、あなたは、+ 10分のカレンダー時間を設定します calendar.setTimeInMillis(System.currentTimeMillis() + 10 * 60 * 1000);

として時間を設定している、とあなたがしていますこのような下の行に同じ時間を設定 am.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);

てみてください、

long myAlarmTime = System.currentTimeMillis() + 10 * 60 * 1000;サービスは、システムによって実行可能な2つの理由があります

再起動したときに、この問題に直面している理由について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

関連する問題