【问题标题】:Closing previous pages in an application关闭应用程序中的先前页面
【发布时间】:2012-06-13 06:12:41
【问题描述】:

我正在制作一个大约有 5 个页面和一个起始屏幕的应用程序,我知道如果我在 onPause() 方法中编写 finish(),一旦用户转到下一页,页面就会被销毁。

我的要求是我不希望 AppPage 1 被销毁,直到我到达应用程序的第 3 页,但是一旦用户进入应用程序的第 4 页,我想销毁所有 1,我的应用程序的 2,3 个 AppPages,以便通过单击后退按钮无法访问它们并直接到达我的应用程序的启动屏幕,我不会在应用程序启动时杀死它们。

所以我想问一下,当用户单击第 3 页的转到下一页按钮时,是否有可能杀死我的应用程序的 1、2、3 页。

谢谢

==== 编辑 =====

Starting Screen -> AppPage1 -> AppPage2 --> AppPage3 --> AppPage4 (Kill AppPage1,2,3 here, so if back is clicked user到达starting screen) --> Appage 5 (Kill AppPage4)

==== 编辑 2 =====

AppPage1.java

public class AppPage1 extends Activity{

Button goToAppPage2;
BroadcastReceiver logout;

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.apppage1);

    IntentFilter intentFilter = new IntentFilter();
    intentFilter.addAction("com.closing.application.pages.AppPage1");

    logout = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
          finish();
        }
    };

    registerReceiver (logout, intentFilter);

    goToAppPage2 = (Button) findViewById(R.id.goToAppPage2);
    goToAppPage2.setOnClickListener(new OnClickListener() {

        public void onClick(View v) {
            // TODO Auto-generated method stub

            Intent i1 = new Intent(AppPage1.this, AppPage2.class);
            startActivity(i1);
        }
    });  

}

@Override
protected void onDestroy() {
    // TODO Auto-generated method stub
    super.onDestroy();
    unregisterReceiver(logout);
}

}

AppPage2.java

public class AppPage2 extends Activity{

Button goToAppPage3;

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.apppage2);

    Intent intent = new Intent("kill");
    intent.setType("spartan!!!");
    sendBroadcast(new Intent(this, AppPage1.class));



    goToAppPage3 = (Button) findViewById(R.id.goToAppPage3);
    goToAppPage3.setOnClickListener(new OnClickListener() {

        public void onClick(View v) {
            // TODO Auto-generated method stub

            Intent i1 = new Intent(AppPage2.this, AppPage3.class);
            startActivity(i1);

        }
    });    
} 
}

【问题讨论】:

  • 您的实际要求是,当您处于活动堆栈中的第四个活动时,您不希望您的应用程序在单击返回按钮时支持返回活动 3 到活动 2 到活动 1。??
  • 不,我希望这些页面被关闭,完全被杀死....就像在相应页面上使用AppPage3.finish()AppPage2.finish()Appage1.finish() 会杀死这些页面,但我希望它们在我到达 AppPage4 后被杀在这里
  • AppPage2 出现错误。当您发送广播消息时,请完全使用我给您的代码。您只需将“com.example.ACTION_LOGOUT”替换为“com.closing.application.pages.AppPage1”。动作名称应该是same.class。如果您不了解这种行为,请阅读 Android 中的广播消息。我希望它有帮助! :)
  • 哦,伙计.....我在关注的两个页面之间感到困惑:-P ...我的错...非常感谢您的快速回复和帮助我:-)跨度>

标签: android applicationpage


【解决方案1】:

您可以通过广播消息来实现这一点。我自己在活动依赖于用户登录的情况下使用它,所以当他注销时,所有这些活动都应该完成,只剩下登录屏幕。

首先,在应该完成的活动中注册广播。如果activity的数量很大,你可以创建一个父Activity,从另一个可以扩展的地方,这样你就不用重复这段代码这么多次了:

IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("com.example.ACTION_LOGOUT");
BroadcastReceiver logout = new BroadcastReceiver() {

    @Override
    public void onReceive(Context context, Intent intent) {
      finish();
    }
};
registerReceiver (logout, intentFilter);

不要忘记在 onDestroy() 上取消注册:

unregisterReceiver(logout);

当您希望完成之前的活动时发送广播:

Intent broadcastIntent = new Intent();
broadcastIntent.setAction("com.example.ACTION_LOGOUT");
sendBroadcast(broadcastIntent);

【讨论】:

  • 对不起,我是新手,无法在我的应用程序中实现这一点,我在上面的问题中提到了这个要求,请你给我一个更详细的答案。谢谢。
  • 将创建广播接收器的第一部分添加到您的 AppPage1、AppPage2 和 AppPage 3 onCreate() 方法。在相同的活动中,取消注册 onDestroy() 方法上的接收器。然后,从您的 AppPage4 发送带有最后一部分的广播消息,活动 1,2 和 3 将自动完成,因为它们将收到广播消息并执行 finish() 语句。
  • 仍然无法使其运行:-( ....我附上了上面的代码..我尝试使用此从 AppPage2 关闭 AppPage1 ...请查看代码并告诉我在犯什么错误!
【解决方案2】:
YourActivityName.this.finish();
                 ^^^^

试试这个,这将不允许用户返回该活动

【讨论】:

  • 我不认为这是我需要的!
【解决方案3】:

试试这个,

使用startActivityForResult(intent,0)从Activity 1调用Activity 2并在Activity 1中编写以下代码

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        switch (requestCode) {
        case 0:
            if (resultCode == RESULT_OK) {
                finish();
            }
        }
    }

在活动 2 中进行类似操作,并使用 startActivityForResult 调用活动 3。

在调用 Activity 4 之前最终形成 Activity 3,您应该只调用 finish() 。如果在Activity 3中调用finish(),前一个Activity编写的回调方法onActivityResult会被执行,它会自行完成。

【讨论】:

  • 如果我理解得很好,他希望页面 1、2、3 无法访问。在启动第 4 个活动时,如果他使用此标志,则主屏幕也将无法访问。
【解决方案4】:

您可以在第 4 页重写 onBackPressed() 方法,这样当用户按下返回键时,他将被强制返回主页,或者您需要的任何内容。

 public void onBackPressed() {
        //code here, like calling back the main page of your app
    }

潜伏我发现了这个问题,也许第三个答案可以帮助你:

How to close all the activities of my application?

【讨论】:

  • 链接似乎很有帮助......让我试试这个:-)
猜你喜欢
  • 2012-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-06
相关资源
最近更新 更多