如何从android中的Paused或Resumed状态恢复到精确的活动

时间:2014-07-21 11:49:05

标签: java android multithreading

我有两个简单的活动MainActivityThreadActivity。我从ThreadActivity致电MainActivity 代码MainActivity

public class MainActivity extends Activity {
    private Button btn;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        btn = (Button)findViewById(R.id.btn2);
        btn.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View v) {
                 Intent intent = new Intent(MainActivity.this, ThreadActivity.class); 
                 startActivity(intent);
             }
         });
    }
}

ThreadActivity的代码:

public class ThreadActivity extends Activity{

    private Thread myThread=null;
    Button btn;
    int i = 0;

     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.custom);

         btn = (Button)findViewById(R.id.btn);
         btn.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View v) {
                     runThread();
             }
         });
     }

     void  runThread(){
         myThread = new Thread() {
                public void run() {
                    while (i++ < 1000) {
                        try {
                            runOnUiThread(new Runnable() {
                                @Override 
                                public void run() {
                                    btn.setText("#" + i);
                                    Log.d("Thread", "I am running " + i);
                                }
                            });
                            Thread.sleep(300);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                            return;
                        }
                    }
                }
            };
            myThread.start();
     }
}

当我开始ThreadActivity时,我运行一个简单的线程并更改按钮文本。

我的问题

  • 当我从应用程序中失去焦点时,即当应用程序变得部分可见时,我回来后,我被重定向到ThreadActivity并且线程仍在运行。
  • 当我让应用程序运行并打开一个新应用程序,然后再回来时,我再次被重定向到ThreadActivity

问题是当我按下后退按钮时,我被重定向到第一个活动MainActivity。但是当按下后退按钮时,我希望我的应用程序退出。简而言之,MainActivity不应该存在于堆栈中。

我尝试为android:noHistory="true"设置MainActivity,但我无法保持在子弹点中解释的行为。我的意思是当我暂停应用程序并将其还原时,它会将我重定向到MainActivity而不是ThreadActivity

3 个答案:

答案 0 :(得分:1)

启动finish()时,只需致电ThreadActivity

btn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Intent intent = new Intent(MainActivity.this, ThreadActivity.class);
        startActivity(intent);
        finish();
    }
});

但是您的应用存在问题。使用Timer设置Button的文字!像你一样使用Thread你会造成内存泄漏,这非常糟糕。试试这个:

private int i = 0;
private Timer timer;
private final TimerTask timerTask = new TimerTask() {

    @Override
    public void run() {
        btn.post(new Runnable() {
            @Override
            public void run() {
                btn.setText("#" + i++);
            }
        });
    }
};


@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.custom);

    btn = (Button)findViewById(R.id.btn);
    btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            timer = new Timer();
            timer.schedule(timerTask, 300, 300);
        }
    });
}

@Override
public void onPause() {
    super.onPause();

    if(timer != null) {
        timer.cancel();
    }
}

答案 1 :(得分:1)

从您对其他人的评论&#39;答案,似乎您希望在线程运行时始终恢复ThreadActivity而不是MainActivity。

  1. 在服务中执行该线程 - 该服务将意味着您的应用程序的VM可能会保持更长时间。没有前台活动的应用程序可以很快被杀死(即使它有后台线程运行)。
  2. 您需要坚持线程正在运行,以及进度(如果在适用的实际代码中)。目前,您可以在while循环中保留i的值。
  3. 当您从启动器点击它时,您的应用程序的默认启动器活动(MainActivity)将启动。检查是否已设置持久值,并表现为用户在onCreate中启动了ThreadActivity,如果在onCreate中finish(),则用户无法看到MainActivity中的任何UI
  4. 根据您实际尝试做的事情,您可以根据持续进度恢复线程 - 在此示例中,您可以从i的持久值(而不是0)开始。 / LI>

答案 2 :(得分:0)

我必须为android:noHistory="true"设置MainActivityThreadActivity我必须在此quesiotn

中添加@NeTeInStEiN提及的解决方案
@Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            moveTaskToBack(true);
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }