2016-08-24 2 views
0

ユーザーがボタンを押してからCountDownTimerでサービスを開始するアプリケーションを作成しています。タイマーが停止すると通知が作成されます。アプリが動作しているときはすべてが完璧に機能しますが、ユーザーがアプリを閉じると通知はありません。私はをとonStopに取り除いて修正しました。しかし、Iuserがアプリを破棄すると(アプリをバックグラウンドから完全に削除する)、通知はまったくありません。アプリが破壊されてもサービスを続けるには? は、ここで私は私のサービス マイStartTimerActivirtクラスを開始する方法をここに私のサービスAndroidサービスは、ユーザーがアプリを離れる場合でもタイマーを実行します(破棄)

public class TimerService extends Service { 
    private final static String TAG = "BroadcastService"; 

    public static final String COUNTDOWN_BR = "your_package_name.countdown_br"; 
    private Intent intent = new Intent(COUNTDOWN_BR); 

    private CountDownTimer countDownTimer; 


    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     long time = intent.getLongExtra("time", 0); 
     Log.d("SDKJDSDSDSDSDSDSD", time + ""); 
     startCount(time); 
     return super.onStartCommand(intent, flags, startId); 
    } 

    private void startCount(long time){ 
     Log.d("SDIUSDSDSD", time + ""); 
     countDownTimer = new CountDownTimer(time, 1000) { 
      @Override 
      public void onTick(long millisUntilFinished) { 
       intent.putExtra("countdown", millisUntilFinished); 
       sendBroadcast(intent); 
      } 

      @Override 
      public void onFinish() { 
       intent.putExtra("countdown", -1); 
       sendBroadcast(intent); 
      } 
     }; 

     countDownTimer.start(); 
    } 

    @Override 
    public void onDestroy() { 
     countDownTimer.cancel(); 
     super.onDestroy(); 
    } 

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

のユーザーによって破壊された場合ので、それはできるだけ早くサービスを開始onStartCommand()

public class DetailChargeActivity extends AppCompatActivity implements View.OnClickListener{ 
    private Button startCharge, startReserveButton; 
    private int selectedYear = -1, selectedMonth = -1, selectedDay = -1; 
    private int startH = -1, startMin = -1, endH = -1, endMin = -1; 
    private Chronometer chronometer; 
    private boolean chronometerStarted = false; 

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

     //.... set up listeners and so on... 
    } 

    @Override 
    public boolean onSupportNavigateUp() { 
     super.onSupportNavigateUp(); 
     finish(); 
     return true; 
    } 

    @Override 
    public void onClick(View view) { 
     startTimer(0, 2); 
    } 


    private void startTimer(int startH, int startMin){ 
     long time = TimeUnit.MINUTES.toMillis(startH * 60 + startMin); 
     Intent intent = new Intent(this, TimerService.class); 
     intent.putExtra("time", time); 
     startService(intent); 
    } 

    private BroadcastReceiver br = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      updateGUI(intent); // or whatever method used to update your GUI fields 
     } 
    }; 

    @Override 
    public void onResume() { 
     super.onResume(); 
     registerReceiver(br, new IntentFilter(TimerService.COUNTDOWN_BR)); 
    } 

    @Override 
    public void onPause() { 
     super.onPause(); 
     // unregisterReceiver(br); 
    } 

    @Override 
    public void onStop() { 
     try { 
      // unregisterReceiver(br); 
     } catch (Exception e) { 
      // Receiver was probably already stopped in onPause() 
     } 
     super.onStop(); 
    } 
    @Override 
    public void onDestroy() { 
     stopService(new Intent(this, TimerService.class)); 
     super.onDestroy(); 
    } 

    private void updateGUI(Intent intent) { 
     if (intent.getExtras() != null) { 
      long millisUntilFinished = intent.getLongExtra("countdown", 0); 
      Log.d("DSDafsdfdfKSD", "SASASASSASAS " + (millisUntilFinished/1000)); 
      if(millisUntilFinished == 0) { 
       buildNotification(); 
      } 
     } 
    } 

    private void buildNotification(){ 
     Log.d("DSDafsdfdfKSD", "ASASSA"); 
     NotificationCompat.Builder mBuilder = 
       new NotificationCompat.Builder(this) 
         .setSmallIcon(R.drawable.ic_cast_dark) 
         .setContentTitle("My notification") 
         .setContentText("Hello World!"); 

     NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 
     notificationManager.notify(1, mBuilder.build()); 
    } 
} 
+0

私がそれをよく理解していれば、Android Notificationで時間を設定できます。あなたは通知のためのタイマーを必要としません – Prashant

+0

私はタイマーが終了するとき私は通知を表示するので、私はタイマーが必要です。それはタイマーが終了する残りのように動作します。 – David

+1

これは非常に重複した質問のようですが、私はあなたに一対のことを教えてくれるでしょう。まず、これは良いパターンではないと思うし、Androidのユーザビリティガイドではほとんどの場合推奨していない。おそらく、ForegroundServiceで試してみて、必要なものがあるかどうか確認してください。 – Hugo

答えて

0

戻りreturn START_STICKY;

それを検出することによって、残りの時間をすべてonTickに保存します。コメントを読む

サービスは、何らかの理由で再開された場合、残り時間とともに再開されます。

public class TimerService extends Service { 
     private final static String TAG = "BroadcastService"; 

     public static final String COUNTDOWN_BR = "your_package_name.countdown_br"; 
     private Intent intent = new Intent(COUNTDOWN_BR); 
     SharedPreferences mPrefs; 
     private CountDownTimer countDownTimer; 
     // here is prefs key 
     String Key = "TIME"; 

     @Override 
     public int onStartCommand(Intent intent, int flags, int startId) { 
      long time = 0; 
      mPrefs = this.getSharedPreferences("myAppPrefs", Context.MODE_PRIVATE); 
      if (mPrefs.getLong(Key, 0) == 0) { 
       time = intent.getLongExtra("time", 0); 
       mPrefs.edit().putLong(Key, time).apply(); 
      } else { 
       time = intent.getLongExtra("time", 0); 
      } 
      // now start the counter 
      Log.d("SDKJDSDSDSDSDSDSD", time + ""); 
      startCount(time); 
      return START_STICKY; 
     } 

     private void startCount(long time) { 
      Log.d("SDIUSDSDSD", time + ""); 
      countDownTimer = new CountDownTimer(time, 1000) { 
       @Override 
       public void onTick(long millisUntilFinished) { 
        long remainingTime = mPrefs.getLong(Key, 0) - millisUntilFinished; 
        mPrefs.edit().putLong(Key, remainingTime).apply(); 
        intent.putExtra("countdown", millisUntilFinished); 
        sendBroadcast(intent); 
       } 

       @Override 
       public void onFinish() { 
        intent.putExtra("countdown", -1); 
        sendBroadcast(intent); 
       } 
      }; 
      countDownTimer.start(); 
     } 
     @Override 
     public void onDestroy() { 
      countDownTimer.cancel(); 
      super.onDestroy(); 
     } 

     @Nullable 
     @Override 
     public IBinder onBind(Intent intent) { 
      return null; 
     } 
    } 
関連する問題