单击通知后恢复次要活动,计时器仍在运行



我从MainActivity打开第二个活动TimerActivity,它从100开始倒数计时。在onPause中,我放入了一个通知,所以如果应用程序进入后台,它会通知用户它仍然处于活动状态。我想实现的是,当用户单击通知时,TimerActivity应该再次打开,并且应该恢复到后台倒计时的时间。它不应该从100重新启动,但如果应用程序在后台运行20秒,则从80继续。

这是只有一个按钮的主活动:

public class MainActivity extends AppCompatActivity {
Button buttonStart;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
buttonStart = (Button)findViewById(R.id.button);
buttonStart.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(getApplicationContext(), TimerActivity.class);
startActivity(intent);
}
});
}

}

这是我的TimerActivity,只有1个文本视图:

public class TimerActivity extends AppCompatActivity {
CountDownTimer timer;
int number = 100;
TextView text;
NotificationCompat.Builder builder;
NotificationManager mNotificationManager;
Boolean notificationRunning = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_timer);
text = (TextView) findViewById(R.id.textView);
builder = new NotificationCompat.Builder(getApplicationContext());
builder.setSmallIcon(R.drawable.gear_icon);
builder.setContentTitle("Notification:");
builder.setContentText("Timer is still running!");
builder.setAutoCancel(true);
timer = new CountDownTimer(number * 60 * 1000, 1000) {
@Override
public void onTick(long l) {
text.setText("" + number);
number = number - 1;
}
@Override
public void onFinish() {
text.setText("finish");
}
}.start();
}
protected void onPause(){
super.onPause();
Intent notifyIntent = new Intent(getApplicationContext(), TimerActivity.class);
notifyIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
PendingIntent pendingIntent =
PendingIntent.getActivity(
getApplicationContext(),
0,
notifyIntent,
PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_ONE_SHOT
);
builder.setContentIntent(pendingIntent);
mNotificationManager =(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationRunning = true;
mNotificationManager.notify(1, builder.build());
}
protected void onResume(){
super.onResume();
if(notificationRunning){
mNotificationManager.cancel(1);
notificationRunning = false;
}
}
}

我知道我缺少一些基本信息,任何帮助都将不胜感激。

更新,如果我使用MainActivity中的一个额外按钮和以下代码,那么它会按预期工作:

Intent openSecondActivity= new Intent(MainActivity.this, TimnerActivity.class);
openSecondActivity.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
startActivityIfNeeded(openSecondActivity, 0);

在我的TimerActivity中,我只是覆盖onBackPressed:

@Override
public void onBackPressed(){
Intent intent = new Intent(getApplicationContext(), MainActivity.class);
startActivity(intent);
}

这样,我启动应用程序,点击开始按钮。计时器从100开始。我点击后退按钮,等待10秒钟。然后,我单击新添加的"继续"按钮,TimerActivity显示在最前面,计时器为90。于是又恢复了。

这是我想要实现的,但在"通知"上单击。

好的,所以当从通知中重新打开应用程序时,您将失去倒计时。您可以简单地将时间作为额外时间添加到notifyIntent

如果您不想使用Service,可以很容易地将计算时间的数据存储到SharedPreferences中。即使在onDestroy()之后也可以使用。

您可以通过存储计时器应该结束的时间(System.currentTimeMillis() + number * 1000)来简化您的生活。将其保存到SharedPreferences中,并在onResume()中恢复您的应用程序状态

在onResume中,您将设置

Long endTime = savedInstanceState.getLong("endTime")
int number = (int) (endTime - System.currentTimeMillis() / 1000);

我终于找到了解决方案:

Intent notificationIntent = new Intent(this, TimerActivity.class);
notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
PendingIntent intent = PendingIntent.getActivity(this, 0, notificationIntent, 0);
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this)
.setSmallIcon(R.drawable.gear_icon)
.setContentTitle("Title")
.setContentIntent(intent)
.setPriority(2)
.setContentText("Content text")
.setAutoCancel(true);
mNotificationManager = (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE);
mNotificationManager.notify(0, mBuilder.build());

通过这种方式,它重新开始计数,原来是在后台。谢谢你的帮助。他们实际上帮助我做到了这一点。

最新更新