【问题标题】:Killing one activity from another从另一个活动中杀死一个活动
【发布时间】:2021-02-09 02:08:21
【问题描述】:

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

【问题讨论】:

  • 哦,是的!遇到同样的问题...
  • 你的问题不清楚。 A 发射透明的 B。当 B 在顶部时,您是否想通过单击 A 中的按钮来停止 B?
  • @gezdy 是的,这就是我想做的。
  • @gezdy 不,不是。我可以按原样使用 A。我只需要找到关闭B的方法。请在发布之前尝试一下。

标签: android android-intent android-activity


【解决方案1】:

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

活动 A 应该有一个变量

 static ActivityA activityA;

在onCreate状态:

 activityA = this;

并添加此方法:

public static ActivityA getInstance(){
   return   activityA;
 }

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

ActivityA.getInstance().finish();     

【讨论】:

  • 我希望它仅在复选框被禁用时终止应用程序。有没有办法只传递一个变量而不使用意图?
  • 可以,使用上面的getInstance,那么就可以访问activityA中的任意公共变量和方法了。在活动B中,状态ActivityA activityA = ActivityA.getInstance();然后只需通过 if(activityA.checkBox){....} 选中您的框
  • 当你关闭 ActivtyA 时,在 Activity B 中杀死对它的引用:activityA = null;
  • 我明白为什么会出现空指针异常。该活动尚未被调用。
  • 我不这么认为,但它是一种访问另一个类的公共项目的方法,其中包括Activity,它仍然只是一个类。共享变量的另一种方法是在单独的类中创建一个静态变量,然后所有活动都可以使用它。
【解决方案2】:

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

在 ActivityA 中做:

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

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

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

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

【讨论】:

  • 它似乎不起作用,我不明白它是如何起作用的。该代码基本上创建了一个新的活动对象,然后对其调用完成。但是,这个对象并不是存储在堆栈中的活动对象。因此,堆栈中的活动将保留在那里。
【解决方案3】:

在我看来,更清晰的方法是创建本地广播,这样就不会出现内存泄漏或 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);

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

编码愉快.... .

【讨论】:

    【解决方案4】:

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

    【讨论】:

    • 你试试这个? classname.static object.finish();
    • 我做了这个B obj=new B; obj.finish(); 我已经编辑了这个问题。请再读一遍。
    【解决方案5】:

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

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

    创建静态方法获取实例:

    public static SampleActivity getInstance(){
        return   sampleActivity;
    }
    

    你想打电话到哪里:

    SampleActivity.getInstance().finish();
    

    确实有效, 问候,

    【讨论】:

    • 谢谢@Joilson。但是,已经接受的答案(@Lumis)和你的答案有什么区别。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-05
    • 2013-03-25
    • 1970-01-01
    • 2016-08-15
    • 2015-09-15
    • 1970-01-01
    相关资源
    最近更新 更多