2017-06-19 21 views
2

たとえば、月の第1、第2、第3日に表示されるローカル通知を作成したいとします(例:11am)。 12時30分、14時30分、18時30分に3日連続で通知を設定しましたが、14時30分に1回しか表示されませんでした。 その時間のアンドロイドモニタをチェックしたとき、アンドロイドがその秒をスキップするように見えますか?ここ は私のコードです:Androidのローカル通知が表示されない場合があります

ここのonCreate

ここ
`@EService 
public class NotifiService extends Service { 
public int counter = 0; 

public NotifiService(Context applicationContext) { 
    super(); 
    Log.w("here!", "here i am"); 
} 
public NotifiService(){ 

} 




@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    super.onStartCommand(intent,flags,startId); 
    Log.i("-----b", "onStartCommand"); 

    startTimer(); 


    return Service.START_STICKY; //super.onStartCommand(intent, flags, startId); 

} 

@Override 
public void onDestroy() { 
    super.onDestroy(); 
    Intent broadCastIntent = new Intent("com.Yyyyy.Xxxxx.Yyyyy.BootBro"); 
    sendBroadcast(broadCastIntent); 
    stopTimerTask(); 
} 

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

@Background 
public void checkDate(){ 
    Log.w("f", "if working"); 
    Calendar cal = Calendar.getInstance(); 
    int d = cal.get(Calendar.DAY_OF_MONTH); 
    int h = cal.get(Calendar.HOUR_OF_DAY); 
    int s = cal.get(Calendar.SECOND); 
    int m = cal.get(Calendar.MINUTE); 
    if(d==17 || d == 18 || d == 19){ 
     if (h == 12 || h == 14 || h == 16) { 

      if (m == 30) { 
       if (s == 30) { 


       Log.w("notify", "working>>>>"); 
        Intent intent = new Intent(getApplicationContext(), MainActivity_.class); 
        PendingIntent contentIntent = PendingIntent.getActivity(getApplicationContext(), 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); 

        NotificationCompat.Builder b = new NotificationCompat.Builder(getApplicationContext()); 

        b.setAutoCancel(false) 
          .setDefaults(Notification.DEFAULT_ALL) 
          .setWhen(System.currentTimeMillis()) 
          .setSmallIcon(R.drawable.ic_app_icon) 
          .setTicker("FabReminder") 
          .setContentTitle("FabReminder") 
          .setContentText(getString(R.string.notification)) 
          .setDefaults(Notification.DEFAULT_LIGHTS | Notification.DEFAULT_SOUND) 
          .setContentIntent(contentIntent); 
        //.setContentInfo("Tap this bar and select shop"); 


        NotificationManager notificationManager = (NotificationManager) getApplicationContext().getSystemService(Context.NOTIFICATION_SERVICE); 
        notificationManager.notify(1, b.build()); 
       } 
      } 
     } 
    } 

} 
private Timer timer; 
private TimerTask timerTask; 
long oldTime=0; 
public void stopTimerTask(){ 
    if (timer != null){ 
     timer.cancel(); 
     timer = null; 
    } 
} 
public void initializeTimerTask(){ 
    timerTask = new TimerTask() { 
     @Override 
     public void run() { 
      checkDate(); 
     } 
    }; 
} 
public void startTimer(){ 
    timer = new Timer(); 
    initializeTimerTask(); 
    timer.schedule(timerTask,1000,1000); 
} 

@Override 
public void onTaskRemoved(Intent rootIntent) { 
    super.onTaskRemoved(rootIntent); 
    Log.w("killed task >>>"," task killed"); 
    Intent broadCastIntent = new Intent("com.Yyyyy.Xxxxx.Yyyyy.BootBro"); 
    sendBroadcast(broadCastIntent); 
}` 

の主な活動のセットアップで私のサービスは私BroadcastReceiverです:

`パブリッククラスBootBroはBroadcastReceiver { 公共int型MIDを拡張します。

@Override 
public void onReceive(Context context, Intent intent) { 
    //context.startService(new Intent(context, NotifiService_.class)); 
    Log.w(BootBro.class.getSimpleName(), "Service stops!"); 
context.startService(new Intent(context, NotifiService_.class)); 


} 

} `

とAndroidManifest

`<service android:name="com.Yyyyy.Xxxx.Yyyyy.NotifiService_" android:enabled="true"/> 
    <receiver android:name="com.Yyyyy.Xxxx.Yyyy.BootBro" android:enabled="true" 
     android:exported="true" 
     android:label="RestartServiceWhenStopped"> 

     <intent-filter><action android:name="android.intent.action.BOOT_COMPLETED"> 

     </action> 
      <action android:name="com.Yyyyy.Xxxx.Yyyy.BootBro"/> 
     </intent-filter> 
    </receiver>` 
+0

違う方法でやりますか? – AndroidStorm

+0

私はあなたのオプションが素晴らしいと思う、たくさんありがとう。私は今日それをチェックする:) – Gorthez

答えて

1

あなたはAlarmManagerで簡単にセットアップすることができます。このアプローチ。

    このクラスは、アラームservices.Theseは、あなたのアプリケーションは、将来のある時点で実行されるようにスケジュールすることができ、システムへのアクセスを提供しています...More

    アラームは、これらの特性を持っています

  • 設定された時間や間隔でインテントを発射させます。
  • ブロードキャストレシーバーと組み合わせて使用​​すると、サービスを開始して他の操作を実行できます。
  • これらはアプリケーションの外部で動作するため、アプリケーションが動作していなくても、またデバイス自体がスリープ状態であってもイベントやアクションをトリガーすることができます。
  • これらは、アプリのリソース要件を最小限に抑えるのに役立ちます。あなたは、バックグラウンドサービスに

公式Androidのドキュメントをタイマーに頼るか、継続的に実行せずに操作をスケジュールすることができますが、here

に従っても、ここsimple appとの一例であることができますチュートリアルを持っているあなたは、セットアップアラームをできること目を覚ます。

関連する問題