启动新意图时保持我的线程运行

时间:2013-08-01 07:39:47

标签: android android-intent

这就是我想要保持我的线程运行(它正在下载文件)的时候我开始一个意图(一个媒体播放器来播放正在下载的内容)。

问题是当我调用我的意图时,会自动调用onPause方法。

那么我应该怎么做才能避免这种情况?

    public class MyActivity extends Activity {

      MyThread my_thread;

      public void onCreate(Bundle icicle) {
        super.onCreate(icicle);

        //Starting My thread
        my_thread = new MyThread();
        my_thread.start();

        // Starting the intent 
        Intent intent = new Intent("android.intent.action.VIEW");
        intent.setDataAndType(uri, "video/*");
        startActivity(intent);

      @Override
      protected void onPause() {
        super.onPause();
        // Stop my thread
        my_thread.interrupt();

       } 
}

编辑:我正在下载一个实时流,所以除非用户决定关闭该活动,否则它没有结束。

3 个答案:

答案 0 :(得分:2)

你可能想看一下AsyncTasks,它们允许在Android上为这些东西提供更好的多线程。

一个快速示例可能如下所示(来自http://developer.android.com/reference/android/os/AsyncTask.html):

private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
     protected Long doInBackground(URL... urls) {
         int count = urls.length;
         long totalSize = 0;
         for (int i = 0; i < count; i++) {
             totalSize += Downloader.downloadFile(urls[i]);
             publishProgress((int) ((i / (float) count) * 100));
             // Escape early if cancel() is called
             if (isCancelled()) break;
         }
         return totalSize;
     }

     protected void onProgressUpdate(Integer... progress) {
         setProgressPercent(progress[0]);
     }

     protected void onPostExecute(Long result) {
         showDialog("Downloaded " + result + " bytes");
     }
 }

编辑:没看到它是连续的流,不要使用上面的代码。也许你应该把它放在原来的问题中?

答案 1 :(得分:0)

当你启动一个新的Activity时,总会调用一个扩展Activity类的OnPause事件,这就是你在startActivity(intent)中所做的事情。

如果您希望线程在退出应用程序时停止下载数据,那么我认为myThread.interrupt()进入OnPause回调的含义,请不要使用“OnPause”,而是选择其他事件。您可以在此处找到有关已启动事件的详细说明:Activity lifecycle

答案 2 :(得分:0)

您可以尝试以下方法之一:

  1. (对于上面的api级别9):使用DownloadManager下载文件,完成后发送广播通知您已完成下载,并且活动可以使用下载的文件。这两篇文章(thisthis)可以帮助您。
  2. 如果您正在为Froyo开发,这是一种非常类似的方法:您可以启动IntentService(即在串行后台线程上进行工作),下载文件,完成后您将发送包含可以找到文件的路径的广播意图。以下两篇文章可以帮助您IntentServicesthisthis
  3. 或者您可以使用AsyncTask
  4. 对于1和2:在您的活动中,您必须注册一个BroadcastReceiver来处理上述意图。类似的东西:

    public class MainActivity extends Activity {
    
        protected BroadcastReceiver myDownloadCompleteReceiver = new BroadcastReceiver() {
    
            @Override
            public void onReceive(Context context, Intent intent) {
                if ("my_package.actions.DOWNLOAD_COMPLETE".equals(intent.getAction())) {
                    String filePath = intent.getStringExtra("DOWNLOAD_PATH");
                    // use the filePath
                }
            }
        };
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            IntentFilter filter = new IntentFilter("my_package.actions.DOWNLOAD_COMPLETE");
            LocalBroadcastManager.getInstance(this).registerReceiver(myDownloadCompleteReceiver, filter);
        }
    
    }