10

我有两个活动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>

当我在活动显示后点击按钮并且第二次将其杀死时,我该怎么做?创作部分显然得到了照顾。我的活动 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

4

5 回答 5

50

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

活动 A 应该有一个变量

 static ActivityA activityA;

在 onCreate 状态:

 activityA = this;

并添加此方法:

public static ActivityA getInstance(){
   return   activityA;
 }

在活动 B 中,调用函数 getInstance()

ActivityA.getInstance().finish();     
于 2013-01-16T10:58:41.413 回答
0

我找到了一种从另一项活动中完成一项活动的好方法,它类似于 Lumis 所做的。所以如果你想从 ActivityB 关闭 ActivityA 你可以这样做:

在 ActivityA 中:

className = this.getClass().getName();

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

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

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

于 2013-05-08T10:43:29.123 回答
0

在我看来,更清晰的方法是创建本地广播,这样就不会出现内存泄漏或 null 问题。实际上,这是将数据传递给先前活动的准确而熟练的方法。首先,在 Activity_A 中创建一个接收器,并在 resume 上注册它,在 destroy 时注册它。在 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);

因此,先前的活动将在接收者注册的地方完成。

快乐的编码......

于 2021-02-08T18:08:21.063 回答
-1

您可以通过调用Activity.finish()来停止其他活动。或者,您可以使用Activity.finishActivity()来完成由 startActivityForResult() 启动的活动。

于 2013-01-16T10:19:05.843 回答
-1

创建静态类变​​量来保存实例:static SampleActivity sampleActivity;

在创建第一个 Activity 时保存实例,如下所示:incidenteActivity = this;

创建一个静态方法来获取实例:

public static SampleActivity getInstance(){
    return   sampleActivity;
}

无论您想打电话到哪里:

SampleActivity.getInstance().finish();

它真的有效,问候,

于 2017-07-19T21:06:18.937 回答