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());
}
}
私がそれをよく理解していれば、Android Notificationで時間を設定できます。あなたは通知のためのタイマーを必要としません – Prashant
私はタイマーが終了するとき私は通知を表示するので、私はタイマーが必要です。それはタイマーが終了する残りのように動作します。 – David
これは非常に重複した質問のようですが、私はあなたに一対のことを教えてくれるでしょう。まず、これは良いパターンではないと思うし、Androidのユーザビリティガイドではほとんどの場合推奨していない。おそらく、ForegroundServiceで試してみて、必要なものがあるかどうか確認してください。 – Hugo