从另一个活动杀死一个活动

11

我有两个活动A和B。B是透明的,A是可见的。我想通过按下A上的按钮来杀死B。

到目前为止,这是我尝试过的:

B obj=new B();
obj.finish();

我创建了一个B对象并试图销毁它,但这没有起作用。

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                intent.putExtra("keep", true);
                startActivity(intent);

这段代码的目的是清除最上层的活动(Activity),即B,并再次调用B,但这次我传递了一个值,以便在几秒钟后B自行销毁。

出于某种原因,这只会堆积更多的活动实例。或者至少我认为是这样,因为屏幕由于许多透明的活动而变得像素化。

这是我的清单:

<activity
        android:name="com.xxx.xxx.B"
        android:excludeFromRecents="true"
        android:theme="@android:style/Theme.Translucent.NoTitleBar"
        android:clearTaskOnLaunch="true" >
    </activity>
我需要怎么做,才能通过一次点击按钮显示活动并第二次点击关闭它?创建部分已得到明确解决。我的活动B弹出,我现在想要关闭它,因为B在顶部。 编辑 我尝试使用复选框,这是代码:
enable.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View arg0) {
            // TODO Auto-generated method stub
            finishActivity(0);
            Intent intent = new Intent(A.this, B.class);
            if (enable.isChecked()) {
                intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                intent.putExtra("keep", true);
                intent.putExtra("value", 10);
                startActivityForResult(intent, 0);
            }
            else
            {
                intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                intent.putExtra("keep", false);
                startActivityForResult(intent, 0);
            }
        }
    });
当启用选中时,该活动被调用,这很好。但是它们会不断堆积。当我选中和取消选中复选框时,并不像这样 A->B->A->B。它变成了 A->B->BB->BBB。

哦,是的!遇到了同样的问题... - s_bei
你的问题不够清晰。A 启动了 B,B 是透明的。你想在 B 处于顶部时通过从 A 点击按钮来停止 B 吗? - gezdy
@gezdy 是的,那就是我想做的。 - Karthik Balakrishnan
@gezdy 不是这样的。我可以直接使用A。我只需要找到关闭B的方法。请在发帖前先尝试一下。 - Karthik Balakrishnan
可能是重复的问题:如何从另一个活动中结束一个活动 - MKJParekh
4个回答

50

您可以尝试通过调用该活动中的一个静态方法来直接终止一个活动:

活动A应该有一个变量

 static ActivityA activityA;

在创建状态中:

 activityA = this;

并添加这个方法:

public static ActivityA getInstance(){
   return   activityA;
 }
在活动B中,调用函数getInstance()。
ActivityA.getInstance().finish();     

2
当您关闭ActivityA时,请在ActivityB中将其引用清空:activityA = null; - Lumis
1
我不这么认为,但这是一种访问另一个类的公共项的方法,其中包括Activity,它仍然只是一个类。共享变量的另一种方法是在单独的类中创建静态变量,然后所有活动都可以使用它。 - Lumis
这只是一种单例模式的方法...没有帮助。 - DJphy
很好,非常简单。TX - ClaudioC
你应该严格避免将Android上下文对象(如Activity)声明为静态,因为可能会导致内存泄漏。 - user221256
显示剩余5条评论

0

在我看来,更清晰的方法是创建一个本地广播,这样就不会出现内存泄漏或空指针问题。实际上,这是将数据传递回前一个活动的确切和熟练的方式。首先,在Activity_A中创建一个接收器,并在恢复时注册它,在销毁时取消注册。在Activi_A(在我的情况下是Bg_show类)中:

 BroadcastReceiver bgshowBroacast = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            String extra = intent.getStringExtra("BROADCAST");
            if (extra != null) {
                if (extra.equalsIgnoreCase("finishBgShowActivity")) {

                    finish();
                    Log.i(TAG, "onReceive: Bg_show_BroadCast receive from bg_send class ");
                }
            }
        }
    };

    @Override
    protected void onResume() {
        super.onResume();
        LocalBroadcastManager.getInstance(mContext).registerReceiver(bgshowBroacast, new IntentFilter("BG_SHOW_BROADCAST"));
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        LocalBroadcastManager.getInstance(mContext).unregisterReceiver(bgshowBroacast);
    }

然后在 Activity_B 中(在我的情况下是 Bg_send 类):

Intent intent = new Intent("BG_SHOW_BROADCAST");
                        intent.putExtra("BROADCAST", "finishBgShowActivity");
                        LocalBroadcastManager.getInstance(mContext)
                                .sendBroadcast(intent);

因此,之前的活动将在接收者注册的位置结束。

编程愉快.... .


0
我找到了一种很好的方法,可以从另一个活动中结束一个活动,这类似于Lumis所做的。因此,如果您想从ActivityB关闭ActivityA,则可以执行以下操作:
在ActivityA中执行:
className = this.getClass().getName();

并将其传递给ActivityB。然后在ActivityB中执行:

((Activity) Class.forName(className).newInstance()).finish();

你可以自己将类名字符串放入className中,但它必须是完整的包含包名的名称。


4
似乎不能工作,我不明白这怎么可能工作。该代码基本上创建了一个新的活动对象,然后在其上调用finish()。但是,该对象并不是存储在堆栈中的活动对象。因此,堆栈中的活动保留在原地。 - omega

-1
创建静态类变量以保存实例: static SampleActivity sampleActivity;
在第一个活动的On Create中保存实例,如下所示: sampleActivity = this;
创建一个静态方法来获取实例:
public static SampleActivity getInstance(){
    return   sampleActivity;
}

无论您想在哪里调用:

SampleActivity.getInstance().finish();

它确实有效, 问候,


谢谢@Joilson。但是,已经被@Lumis接受的答案和你的答案有什么区别呢? - Rohit Sharma

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接