【问题标题】:App is resuming form a On-click method When I Exit and Reopen It?Android当我退出并重新打开它时,应用程序正在从单击方法恢复?Android
【发布时间】:2017-09-11 04:55:49
【问题描述】:

我在那做了一个 3 页的活动

  1. 闪屏
  2. 主要活动
  3. 结果

所以我在这里将一个值从MainActivityURL 查询字符串传递给服务器到那里的Results 页面,它将显示结果。

我就是这样路过

主活动:

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

        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar2);
        setSupportActionBar(toolbar);

        final Button click = (Button) findViewById(R.id.sc);
        click.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                MainActivity.this.finish();
                //MainActivity.this.finishAndRemoveTask();
                Intent la = new Intent(MainActivity.this, Results.class);
                la.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
                la.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                la.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
                la.setFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
                startActivity(la);
            }
        });
}

所以它会显示一些值作为结果。在那里,我在9000ms 之后添加了一个结果处理程序,它将再次返回到MainActivity

结果:

new android.os.Handler().postDelayed(new Runnable() {
    @Override
    public void run() {
        Results.this.finish();

        Intent v = new Intent(Results.this, SplashScreen.class);
        v.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
        v.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        v.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
        v.setFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
        startActivity(v);
    }
}, 9000);

在主要活动的部分,我添加了一个关于退出整个应用程序是/否选项的后按警报

主活动:

  @Override
    public void onBackPressed() {

        AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
        alertDialogBuilder.setTitle("Do You Want to Exit App!");
        alertDialogBuilder
                .setMessage("Click Yes to Exit!")
                .setCancelable(false)
                .setPositiveButton("Yes",
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int id) {
                                moveTaskToBack(true);
                                MainActivity.this.finish();
                                android.os.Process.killProcess(android.os.Process.myPid());
                                System.exit(0);
                            }
                        })

                .setNegativeButton("No", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {

                        dialog.cancel();
                    }
                });
        AlertDialog alertDialog = alertDialogBuilder.create();
        alertDialog.show();
    }

这里它已成功退出应用程序,但是当我重新打开应用程序时,它从 Results 页面开始,即使我正在处理程序中从 Results 移动到 SplashScreen

这里我已经在 MainActivity 中删除了

/* @Override
protected void onResume() {
    super.onResume();
}*/

但它总是从Results 页面开始。谁能建议如何完全退出此应用或如何停止从结果页面恢复?

更新

这里有退出问题...我在按下退出选项时给出了退出选项

所以我有两种情况

场景 1

当我启动应用程序时,它将从SplashScreen --> MainActivity 开始。所以我在这里退出应用程序MainActivity - 它退出很好。这里的出口工作正常。

当我退出后重新打开应用程序时,它将从SplashScreen开始--> MainActivity

场景 2

它开始与第一个相同,但在MainActivity 我有一个按钮。当我单击该按钮时,我将传递一个带有IntentURL 查询字符串,然后它将在9000 毫秒后从Results 页面开始,它将再次转到SplashScreen --> MainActivity

所以我也在MainActivity退出应用程序

但是当我退出后重新打开应用程序时,它将从Results 页面表单开始并执行该处理程序,甚至一次又一次地转到SplashScreen

谁能建议我给MainActivityonCreate()onBackPressed()....的遗漏。

没有onResume().. 但我面临与Scenario2 相同的问题。

【问题讨论】:

  • 你在哪里调用启动结果活动的第一段代码?
  • 我正在使用 Intent 在OnCreate()调用结果活动
  • @MLN 不,伙计,他的意思是用哪种方法?在下面查看我的答案
  • @MLN 是的,但你在哪里称呼它?请发布更多代码。
  • 请每隔 1 年检查一次我的更新代码

标签: android android-activity exit


【解决方案1】:

尝试改变

发件人:

MainActivity.this.finish();

MainActivity.this.finishAndRemoveTask();

【讨论】:

【解决方案2】:

您在 Results 类中创建的处理程序导致内存泄漏。该处理程序仍在保留活动的引用并在后台运行。尝试创建这样的处理程序。

Runnable runnable;
Handler newHandler;

newHandler = new Handler();
runnable = new Runnable() {
    @Override
    public void run() {
        try {
            //update UI
        } catch (Exception e) {
            e.printStackTrace();
        } 
    }
};
newHandler.postDelayed(runnable,0);

并确保通过调用

删除 Activity 的 onStop() 中的所有消息
newHandler.removeCallbacks(runnable);

或者这是一个更好的实现

http://www.androiddesignpatterns.com/2013/01/inner-class-handler-memory-leak.html

【讨论】:

    【解决方案3】:

    你也可以使用

    finishAndRemoveTask();
    

    finishAffinity();

    【讨论】:

      【解决方案4】:

      您在哪里编写了打开 Result 活动的代码?是在 Main 活动的 onCreate() 还是 onStart() 方法中?如果是,则将其移至任何视图的单击事件的侦听器。

      在您的布局 xml 中创建一个按钮,然后在您的 onCreate() 方法中编写以下代码:

      Button button = (Button) findViewById(R.id.my_button);
      button.setOnClickListener(new View.OnClickListener() {
              @Override
              public void onClick(View v) {
                  MainActivity.this.finish();
                  //MainActivity.this.finishAndRemoveTask();
                  Intent la = new Intent(MainActivity.this, Results.class);
                  la.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
                  la.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                  la.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
                  la.setFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
                  startActivity(la);
              }
          });
      

      【讨论】:

      • OnCreate()
      • 这是真正的问题..当您的活动开始时,它会立即完成并打开结果活动..如果您想打开一个结果活动,然后创建一个按钮并在该按钮的点击监听器上打开结果活动..
      • 什么?我已经有一个 Button 和它的开头....这里有退出和恢复的问题
      【解决方案5】:
      new android.os.Handler().postDelayed(new Runnable() {
          @Override
          public void run() {
      
              Intent v = new Intent(Results.this, SplashScreen.class);
              v.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
              v.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
              v.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
              v.setFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
              startActivity(v);
              Results.this.finish();
          }
      }, 9000);
      

      finish() 应该在 startActivity() 之后调用。你使用的 finish() 是第一个。我认为这是错误的。

      【讨论】:

      • 谢谢@H Zan 我已经试过了,....这里的问题是它返回到初始屏幕,然后在结果之后返回到 MainActivity 然后我正在退出 MainActivity 但是当我打开 Activity 它的起始形式结果而不是 Splash
      • 没关系。调用finish()不会返回方法,startActivity()肯定会被调用
      【解决方案6】:

      在处理程序的startActivity之后添加这一行并检查

      结果.this.finish();

      【讨论】:

      • 我已经在 Intent 删除了这个......它仍然是一样的......但是如果我在 Onback 上删除它按下它甚至不会退出
      【解决方案7】:

      这是由于每个 Activity 都有自己的任务造成的。您使用FLAG_ACTIVITY_NEW_TASK 有什么原因吗?只需将其删除,因为您的设计不需要它,您应该可以解决您的问题。

      【讨论】:

        【解决方案8】:

        试试这个后按按钮。 这可能对你有用。

              @Override
                public void onBackPressed() {
                    new AlertDialog.Builder(this)
                            .setIcon(R.drawable.shutdown)
                            .setTitle("Warning!!!")
                            .setMessage("Are you sure you want to Logout?")
                            .setPositiveButton("Yes", new DialogInterface.OnClickListener()
                            {
                                @Override
                                public void onClick(DialogInterface dialog, int which) {
                                    //finish();
                                   // exit(0);
                                   Intent intent = new 
                                   Intent(getApplicationContext(), MainActitivy.class);
                                   intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                                   intent.putExtra("EXIT", true);
                                   startActivity(intent);
        
                                }
        
                            })
                            .setNegativeButton("No", null)
                            .show();
                }
        

        【讨论】:

        • 谢谢@Sanjay Kumaar ......在这里按下我正在退出应用程序没有移动到启动屏幕......我正在退出整个应用程序
        • 我正在添加另一个可能对您有帮助的答案-@MLN
        • 我改变了一些东西。再试一次
        • 谢谢@Sanjay Kumaar ...在这里恢复或退出时出现问题,,我在后退时提供退出选项。如果我在从结果页面退出显示后打开它,则成功退出.. 如果没有进入结果页面就退出它的工作正常...您的代码没问题,但它没有退出整个应用程序
        猜你喜欢
        • 1970-01-01
        • 2020-09-24
        • 1970-01-01
        • 2015-01-13
        • 1970-01-01
        • 1970-01-01
        • 2015-06-08
        • 1970-01-01
        • 2012-12-29
        相关资源
        最近更新 更多