Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/195.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在通知单击时恢复辅助活动,计时器仍在运行_Java_Android - Fatal编程技术网

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

Java 在通知单击时恢复辅助活动,计时器仍在运行,java,android,Java,Android,我正在从主活动开始第二个活动TimePractivity,它从100开始倒计时。在onPause中,我加入了一个通知,因此如果应用程序转到后台,它会通知用户它仍然处于活动状态。我想实现的是,当用户单击通知时,TimePractivity应该再次打开,并且应该恢复到后台倒计时的时间。它不应该从100开始重新启动,但是如果应用程序在后台运行了20秒,它应该从80开始继续 以下是只有一个按钮的主要活动: public class MainActivity extends AppCompatActivi

我正在从主活动开始第二个活动TimePractivity,它从100开始倒计时。在onPause中,我加入了一个通知,因此如果应用程序转到后台,它会通知用户它仍然处于活动状态。我想实现的是,当用户单击通知时,TimePractivity应该再次打开,并且应该恢复到后台倒计时的时间。它不应该从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);
        }
    });
}
}

以下是我的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(),只在前台继续它。在一秒钟内更新帖子。我正在考虑,但是如果我想用计时器更新通知,那么显示通知中剩余的秒数,它停止的时间是不够的。你总是可以通过从停止的时间减去当前时间来推断剩余的时间。