Java 在通知单击时恢复辅助活动,计时器仍在运行
我正在从主活动开始第二个活动TimePractivity,它从100开始倒计时。在onPause中,我加入了一个通知,因此如果应用程序转到后台,它会通知用户它仍然处于活动状态。我想实现的是,当用户单击通知时,TimePractivity应该再次打开,并且应该恢复到后台倒计时的时间。它不应该从100开始重新启动,但是如果应用程序在后台运行了20秒,它应该从80开始继续 以下是只有一个按钮的主要活动:Java 在通知单击时恢复辅助活动,计时器仍在运行,java,android,Java,Android,我正在从主活动开始第二个活动TimePractivity,它从100开始倒计时。在onPause中,我加入了一个通知,因此如果应用程序转到后台,它会通知用户它仍然处于活动状态。我想实现的是,当用户单击通知时,TimePractivity应该再次打开,并且应该恢复到后台倒计时的时间。它不应该从100开始重新启动,但是如果应用程序在后台运行了20秒,它应该从80开始继续 以下是只有一个按钮的主要活动: public class MainActivity extends AppCompatActivi
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);
}
});
}
}
以下是我的TimePractivity,仅限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);
在我的时间实践中,我只是简单地覆盖了onBackPressed:
@Override
public void onBackPressed(){
Intent intent = new Intent(getApplicationContext(), MainActivity.class);
startActivity(intent);
}
这样,我启动应用程序,点击开始按钮。计时器从100开始计时。我点击后退按钮并等待10秒钟。然后我单击新添加的Resume按钮,TimeActivity显示在最前面,计时器为90。于是它又恢复了
这是我想要实现的,但在通知上单击。确定,因此当从通知重新打开应用程序时,您将失去倒计时。您可以简单地将时间作为额外的时间添加到您的
notifyIntent
中。如果您不想使用该服务,您可以轻松地存储计算时间的数据。您甚至可以使用onDestroy()
通过存储计时器应完成的时间(System.currentTimeMillis()+number*1000
),您的生活变得更加轻松。将其保存到并在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());
这样,它就恢复了计数,原来是背景。谢谢你的帮助。他们实际上帮助我实现了这一点。倒计时程序仍在后台运行,如果我从revent应用程序重新打开应用程序,就可以了。它不再从100开始。@Gexo预期的结果是“如果应用程序在后台运行20秒,它不应该从100开始重新启动,而是从80开始继续。”。实际结果如何?您仍然需要使用onSaveInstanceState,因为您的活动在BG中时可能会被系统终止。此时,当我单击通知时,它将从100重新启动。所以基本上它调用onCreate。预期的结果是,不调用onCreate(),只在前台继续它。在一秒钟内更新帖子。我正在考虑,但是如果我想用计时器更新通知,那么显示通知中剩余的秒数,它停止的时间是不够的。你总是可以通过从停止的时间减去当前时间来推断剩余的时间。