杀死另一个活动

时间:2013-01-16 10:04:07

标签: 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);

这段代码应该做的是清除最顶层的活动,即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在顶部。

修改

我用checkBox尝试了这个,这是代码:

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

5 个答案:

答案 0 :(得分:43)

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

活动A应该有一个变量

 static ActivityA activityA;

在onCreate状态:

 activityA = this;

并添加此方法:

public static ActivityA getInstance(){
   return   activityA;
 }

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

ActivityA.getInstance().finish();     

答案 1 :(得分:0)

您可以致电Activity.finish()停止其他活动。或者,您可以使用Activity.finishActivity()完成startActivityForResult()启动的活动。

答案 2 :(得分:0)

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

在ActivityA中:

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

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

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

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

答案 3 :(得分:0)

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

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

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

public static SampleActivity getInstance(){
    return   sampleActivity;
}

无论你想在哪里打电话:

SampleActivity.getInstance().finish();
它确实有效, 的问候,

答案 4 :(得分:0)

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

 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);

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

快乐编码.....