Android 从一个活动中删除另一个活动

Android 从一个活动中删除另一个活动,android,android-intent,android-activity,Android,Android Intent,Android Activity,我有两个活动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); 这段代码应该做

我有两个活动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);
这段代码应该做的是清除最上面的活动,即B,然后再次调用B,除了这次我传递一个值,使得B在几秒钟后自杀

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

这是我的舱单:

<activity
        android:name="com.xxx.xxx.B"
        android:excludeFromRecents="true"
        android:theme="@android:style/Theme.Translucent.NoTitleBar"
        android:clearTaskOnLaunch="true" >
    </activity>

当选中enable时,将调用活动,这可以正常工作。但是他们继续堆积。当我选中并取消选中复选框时,它不是这样的A->B->A->B。是A->B->BB->BBB

您可以通过呼叫停止其他活动。或者,您可以使用来完成由startActivityForResult()启动的活动。

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

活动A应该有一个变量

 static ActivityA activityA;
在onCreate状态下:

 activityA = this;
并添加此方法:

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


我找到了一个很好的方法来完成一个又一个活动,这与Lumis所做的类似。 因此,如果要从ActivityB关闭ActivityA,可以执行以下操作:

在活动A中,请执行以下操作:

className = this.getClass().getName();
并将其传递给AvtivityB。然后在ActivityB中执行以下操作:

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

您可以自己将带有类名的字符串放入className中,但它也必须是package的全名。

创建静态类变量以保存实例: 静态采样活动采样活动

创建第一个活动时,保存实例,如下所示: 偶然性=此

创建静态方法以获取实例:

public static SampleActivity getInstance(){
    return   sampleActivity;
}
无论您想打电话到哪里:

SampleActivity.getInstance().finish();
真的很管用,
关于,

在我看来,更清晰的方法是创建本地广播,这样就不会出现内存泄漏或空值问题。实际上,这是将数据传递给以前活动的准确而熟练的方法。首先,在Activity_a中创建一个接收者,并在resume上注册,然后在destroy上注册。在Activi_A(在我的例子中是Bg_show类):

然后在活动B中(在我的例子中是Bg_send类):

因此,前面的活动将在接收者注册的位置完成


快乐编码

哦,是的!有同样的问题…你的问题不清楚。A启动透明的B。当B在上面时,你想通过点击a的按钮来阻止B吗?@gezdy是的,这就是我想做的。@gezdy不,不是。我可以用原样的。我只需要找到一种方法来关闭B。请在发布前尝试。可能是重复的您尝试这个吗<代码>classname.static对象.finish()我做了这个
B obj=new B;obj.finish()我已经编辑了这个问题。请重新阅读。我希望只有当复选框被禁用时,它才能终止应用程序。有没有一种方法可以在不使用意图的情况下传递一个变量?是的,使用上面的getInstance,然后您可以访问activityA中的任何公共变量和方法。在活动B中,状态ActivityA ActivityA=ActivityA.getInstance();然后简单地通过if(activityA.checkBox){….}选中您的复选框当您关闭activityA时,在activityb中终止对它的引用:activityA=null;我理解为什么会出现空指针异常。活动还没有被调用。我不这么认为,但它是访问另一个类的公共项的一种方式,其中包括活动,它仍然只是一个类。共享varibales的另一种方法是在单独的类中创建一个静态varibales,然后所有活动都可以使用它。它似乎不起作用,我无法理解这是如何起作用的。代码基本上创建一个新的活动对象,然后对其调用finish。但是,此对象不是存储在堆栈中的活动对象。因此,堆栈中的活动保持不变。谢谢@Joilson。但是,已经被@Lumis接受的答案和你的答案有什么区别呢。
public static SampleActivity getInstance(){
    return   sampleActivity;
}
SampleActivity.getInstance().finish();
 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);
    }
Intent intent = new Intent("BG_SHOW_BROADCAST");
                        intent.putExtra("BROADCAST", "finishBgShowActivity");
                        LocalBroadcastManager.getInstance(mContext)
                                .sendBroadcast(intent);