通知点击时恢复辅助活动,计时器仍在运行

时间:2017-11-20 13:25:03

标签: java android

我正在从我的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.所以它恢复了。

这是我想要实现的目标,但在通知点击上。

4 个答案:

答案 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());

这样,它恢复计数,它就是背景。谢谢您的帮助。他们实际上帮我带来了这个。

相关问题