我正在从我的MainActivity打开第二个活动TimerActivity,它从100开始倒数计时器。在onPause中我输入了一个通知,所以如果应用程序转到后台,它会通知用户它仍处于活动状态。我想要实现的是,当用户点击通知时,TimerActivity应该再次打开,它应该恢复到它在后台倒计时的时间。它不应该从100重新启动,但如果应用程序在后台运行20秒,则从80继续。
以下是MainActivity,只有一个Button:
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个TextView:
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秒钟。然后我单击新添加的Resume按钮,TimerActivity到达前面,计时器为90.所以它恢复了。
这是我想要实现的目标,但在通知点击上。
答案 0 :(得分:1)
好的,所以当从通知中重新打开应用程序时,您将丢失倒计时。您只需将时间作为额外内容添加到notifyIntent
答案 1 :(得分:0)
如果您不想使用服务,则可以轻松地将计算时间的数据存储到SharedPreferences。您甚至可以在WITH RESULT SETS
之后使用。
答案 2 :(得分:0)
您可以通过存储计时器完成时间(System.currentTimeMillis() + number * 1000
)来让您的生活更轻松。将其保存到SharedPreferences并在onResume()
在onResume中你可以设置
Long endTime = savedInstanceState.getLong("endTime")
int number = (int) (endTime - System.currentTimeMillis() / 1000);
答案 3 :(得分:0)
我终于找到了解决方案:
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());
这样,它恢复计数,它就是背景。谢谢您的帮助。他们实际上帮我带来了这个。