【问题标题】:In android how do you manage Intents to be passed only when the app is alive?在android中,您如何管理仅在应用程序处于活动状态时才传递的意图?
【发布时间】:2014-03-22 09:11:02
【问题描述】:

我有这个活动 X,它将通过 AsyncTask 获取的一些数据传递给活动 Y。直到从 AsyncTask 获取数据之前,有一个加载进度条可见,直到 AsyncTask 成功的“doPostMethod”方法。现在,当这个数据获取的后台过程执行时,当用户按下手机的后退按钮时,应用程序会转到上一个活动,但是会发生什么情况是,活动 X 的 doPostMethod 被调用,然后继续进行活动 Y与它必须发送的数据。有什么办法可以消除这个bug?

doBackground : 从远程 API 调用中获取结果 doPost 方法:

protected void onPostExecute(String result) {
    super.onPostExecute(result);
    loader.setVisibility(View.GONE);
    Intent preSummaryIntent = new Intent(PreSummary.this, SummaryList.class);
    preSummaryIntent.putExtra(SEARCH_RESULTS, result);
    startActivity(preSummaryIntent);
}

【问题讨论】:

  • 请显示代码和 logcat 日志。谢谢。
  • 编辑我的内容以添加代码

标签: android android-intent android-asynctask


【解决方案1】:

对 dailog 使用 setCancelable(false) 以防止在进程未完成时关闭对话框。您可以取消您的异步任务,因为这样做会覆盖您的活动中的 onBackPressed() 并初始化检查您的异步任务是否正在运行,然后通过调用“task.cancel(true)”取消它以取消异步任务,如下所示

    @Override
 public void onBackPressed() {
    if(asyncTask != null){
        if(asyncTask.getStatus() == Status.RUNNING){
            asyncTask.cancel(true);
            asyncTask = null;
        }
     }
}

【讨论】:

  • 我真的不知道你想说什么。我接受我是 android 开发中的菜鸟。
  • 嘿,谢谢。但是当progressdialog 正在运行并且我点击后退按钮时,它会关闭progressdialog,同时它仍然在后台运行asynctask。它不会被取消! :o
  • 当进度对话框可见并且您点击后退按钮时,onBackPressed 对话框被称为不是活动的,因此您需要为进度对话框设置“setCancelable(false)”。如果您还有问题,请告诉我
  • 现在试试.. #Update :D
  • 太棒了!用户 3337034。虽然我无法反击,但一旦异步任务正在进行,我至少会阻止下一个活动打开!
【解决方案2】:

首先,您想检查您的应用程序是否像保持活动状态一样运行。那么只有你必须传递你的意图值。

试试这段代码,看看你的应用程序是否正在运行..

ActivityManager activityManager = (ActivityManager) this.getSystemService(ACTIVITY_SERVICE);
List<RunningAppProcessInfo> procInfos = activityManager.getRunningAppProcesses();
for(int i = 0; i < procInfos.size(); i++){
   if(procInfos.get(i).processName.equals("com.me.checkprocess"))
   {
        Log.e("Result", "App is running - Doesn't need to reload");
        break;
   }
   else
   {
        Log.e("Result", "App is not running - Needs to reload);
   }
}

或设置任何布尔变量,然后检查它以传递您的 Intent 值..

Intent i = new Intent(LoginActivity.this,MainActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
i.putExtra("USER", userData);
Intent i1 = new Intent(LoginActivity.this,Pacs_WakeupService.class);
i1.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
i1.putExtra("USER", userData);                      
startActivity(i);

【讨论】:

    【解决方案3】:

    兄弟,在你的 PostExecuteMethod() 中测试很简单;

    检查我的代码....您会非常喜欢这种床逻辑。我正在使用一个活动组件来测试我是否还活着的活动。

        protected void onPostExecute(String result) {
            if (imgageView != null && result != null) {
                startActivity(new Intent(MainMenuActivity.this, SubmitOrderActivity.class));
            }
       }
    

    我希望它对你有用:)

    编辑: 如果您想在切换活动时停止异步

    @Override
        protected void onPause() {
            if (download != null && download.getStatus() != AsyncTask.Status.FINISHED) {
                download.cancel(true);
            }
            super.onPause();
        }
    

    【讨论】:

    • 所以这只有在获取的结果不为空时才有效,对吧?但问题是,dobackground 会不断轮询 API 请求,直到获得有效响应。一旦得到响应,它将开始下一个活动。
    • 只有在 doBackGround 完成处理和轮询 API 请求时才会调用 OnPostExecute。
    • 但问题是,即使我按下后退按钮,asynctask 也会继续运行。我同意它不会启动活动。但它仍然会继续使用互联网,不是吗。 ?
    猜你喜欢
    • 1970-01-01
    • 2011-06-11
    • 1970-01-01
    • 1970-01-01
    • 2014-12-07
    • 2021-02-22
    • 2018-06-22
    • 1970-01-01
    • 2017-09-10
    相关资源
    最近更新 更多