【问题标题】:How to bring activity to front using finish from another activity如何使用其他活动的完成将活动置于前面
【发布时间】:2013-03-20 00:31:53
【问题描述】:

我有两个活动:A 和 B。

从 A 到 B:

onCreate

Context context = this;

点击

Intent i = new Intent(context,B.class);
startActivity(i);

从 B 到 A: (如果 B 有返回 A 的按钮)

button.setOnClickListener(new View.OnClickListener(){
   public void onClick(View v){
      finish();
   }
});

但如果流程是这样的:

A 呼叫 B,正在观看 B 的用户单击 Home 按钮并再次从启动的活动中单击 B,然后单击按钮调用 finish(),它转到主页而不是我的第一个活动 A。我该怎么做?

编辑:

  1. A->B // 带有 startActivity(Intent);
  2. B->Home // 点击设备上的主页按钮
  3. Home->B // 从已启动的活动中单击我的应用程序
  4. B.finish() -> Home 而不是 A //finish 或 onBackPressed 做同样的事情

【问题讨论】:

  • 您可以使用活动单任务并使用意图启动活动,然后如果实例存在,则只有最后一个实例会被带到前面(并且不会执行创建)
  • 这就是我所做的;)
  • 你的活动是单一任务吗?
  • 是的.. 所以 startActivity 会将那个活动带到前面而不是创建一个新的

标签: android android-activity activity-finish home-button


【解决方案1】:

检查下面的代码:我有 3 个活动:MainActivity、A_Acvitiy、B_actiivty(希望它按照您的要求工作..)

package com.example.androidtest;

import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.view.View;

public class MainActivity extends Activity {

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

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }

    public void callActivity(View v) {
        if (v.getId() == R.id.button1) {
            // A
            startActivity(new Intent(MainActivity.this, A_activity.class));
        }

        if (v.getId() == R.id.button2) {
            // B
            startActivity(new Intent(MainActivity.this, B_activity.class));
            if (GeneraClass.isFormB) {
                            GeneraClass.isFormB = false;
                finish();
            }
        }
    }
}

A_activity:

package com.example.androidtest;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;

public class A_activity extends Activity {

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

    public void callActivity(View v) {
        if (v.getId() == R.id.button1) {
            // B
            startActivity(new Intent(A_activity.this, B_activity.class));
                 finish();
        }

    }

}

b_activity:

package com.example.androidtest;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;

public class B_activity extends Activity {

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

        setContentView(R.layout.b_layout);
    }

    public void callActivity(View v) {
        if (v.getId() == R.id.home) {
            // home
            GeneraClass.isFormB = true;
            startActivity(new Intent(B_activity.this, MainActivity.class));
            finish();
        }

    }
}

我的额外课程:

package com.example.androidtest;

public class GeneraClass {

    public static boolean isFormB = false;
}

所以,Home-->A(finish)-->B--->Home(if from b then finish)-->B-->Back--> Home --->Back--> exit App

【讨论】:

    【解决方案2】:

    你能试试这个吗:-

    为什么你使用getApplicationContext() 而不是thisActivity A name.

    A ->B

     Intent i = new Intent(yourcurrentActivity,B.class);
     startActivty(i);
    

    B ->A

    致电finish()

    更新如果你正在使用这个:- 删除它

    android:noHistory="true";
    

    【讨论】:

    • 我不想重新开始我的 A 课。我不需要在 onCreate 中执行代码
    • 你想在finish()之后回家或FirstActivity
    • FirstActivity.. 但我不需要再次创建 FirstActivity,只需将它放在前面隐藏第二个
    • 没办法..(见编辑)用 myApplication 代替 getApplicationContext() 它回家而不是在 firstActivity
    • android:noHistory="false" 在您的第一个活动中的清单文件中,或者删除它....如果您使用它。
    【解决方案3】:

    试试这个:

    startActivity(new Intent(B.this,B.class));
    

    在活动A中完成()作为

    // in your activity A
    Intent i = new Intent(getApplicationContext(),B.class);
    startActivity(i);
    finish();
    

    public void OnBackPressed()
    {
    finish();
    }
    

    【讨论】:

    • 我不想再开始上课了
    • 抱歉,为什么我必须在活动 A 上执行 finish()?
    • 你说我不想重新开始A课。所以它会完成活动A。否则当你按下后退按钮时,它将转到活动A
    【解决方案4】:

    试试这个:

    public void startActivityForResult (Intent intent, int requestCode)
    

    【讨论】:

    • 在发布代码作为您的答案时,还要解释它为什么以及如何工作。
    【解决方案5】:

    打电话

    onBackPressed();
    

    而不是

    finish();
    

    【讨论】:

    • sorry... 但是 onBackPressed() 与 finish() -> A->B, B->Home,Home->B,(B.onBackPressed() || B. finish()) -> Home 而不是 A
    猜你喜欢
    • 2016-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-18
    相关资源
    最近更新 更多