4

我需要从广播接收器关闭当前活动。我不确定如何从中调用完成,也许有一种方法可以模拟“返回”键按键。只要能完成工作,任何实现都可以。

@Override
public void onReceive(Context context, Intent intent) {
// How can I finish the current activity here?
}
4

10 回答 10

2

在你的广播接收器上写: YourCurrentActivityName.this.finish();

或者你可以用 this.finish(); 终止前面的活动。所以最后一个被卡住的打开出现在前面。


更新: 第一种情况的代码:

使用广播接收器在后台终止活动:

public class ActivityFirstName extends Activity {

    private BroadcastReceiver mFinishReceiver;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        // other code

        if (mFinishReceiver == null) {
            IntentFilter intentFilter = new IntentFilter();
            intentFilter.addAction("com.example.ACTION_TERMINATE");// a string to identify your action
            mFinishReceiver = new BroadcastReceiver() {
                @Override
                public void onReceive(Context context, Intent intent) {
                    // How can I finish the current activity here?
                    if ("com.example.ACTION_TERMINATE".equals(intent.getAction())) {
                        ActivityFirstName.this.finish();
                    }
                }
            };
            registerReceiver(mFinishReceiver, intentFilter);
        }

        // other code

    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (isFinishing()) {
            if (mFinishReceiver != null) {
                unregisterReceiver(mFinishReceiver);
            }
        }
    }

}

以及前面/当前正在运行的活动,广播的发送者:

public class ActivitySecondName extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.second);

        // code code code

        final Button button = (Button) findViewById(R.id.button_id);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // Perform action on click
                terminateBackActivities();
            }
        });
    }

    private void terminateBackActivities() {
        Intent i = new Intent("com.example.ACTION_TERMINATE"); // the two action strings MUST be same
        // i.putExtra(...); // to send extra data
        sendBroadcast(i);
    }

}
于 2013-02-04T00:04:52.737 回答
1

从您的评论中假设 BroadcastReceiver 不是活动的内部类,您应该这样做:与其将广播接收器放在单独的类中,不如在您的活动中定义它,如下所示:

private BroadcastReceiver mFinishReceiver = new BroadcastReceiver(){
@Override
    public void onReceive(Context context, Intent intent){
        YourActivity.this.finish();
    }
};

然后,您将希望在 onResume() 中注册接收器,如下所示:

@Override
public void onResume(){
    super.onResume();
    registerReceiver(mFinishReceiver, new IntentFilter(yourIntentAction));
}

您还需要在 onPause() 中取消注册此接收器,以免泄漏它:

@Override
public void onPause(){
    super.onPause();
    unregisterReceiver(mFinishReceiver);
}

然后,您可以删除具有自己的单独类的另一个接收器,并在清单中删除其定义。上面的示例将确保您始终可以毫无问题地调用 finish(),因为接收器仅在活动运行时注册,因为它是活动类的内部。

编辑:根据 madlymad 的评论,将方法更改为 onCreate() 和 onDestroy() 而不是 onPause() 和 onDestroy()。

于 2013-02-06T16:44:40.217 回答
1

你可以简单地打电话this.finish();

于 2013-02-01T04:49:31.570 回答
0

尝试使用:

Intent i = new Intent(context,intent.getClass());
于 2013-02-07T13:42:46.840 回答
0

按照 gezdy 关于如何在 android 中获取当前前台活动上下文的说明进行操作?以确保您可以从应用程序的任何位置获取对当前活动的引用。

从那里您可以调用 .finish() 来关闭当前活动。

于 2013-02-25T17:47:49.873 回答
0

不确定这是否对您有帮助,但它曾经帮助过我一次,我认为这里的情况相同,所以我为您回答。

每当广播接收器接到电话时,您都可以通过单击该广播消息导航到任何活动。

就像:

@Override
public void onReceive(Context context, Intent intent) {
    // My Notification Code
    notificationManager = (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE);
    int icon = R.drawable.app_icon;
    //System.out.println("The ID Number is: "+Long.parseLong(intent.getData().getSchemeSpecificPart()) );
    contentText = intent.getStringExtra("MyMessage");
    System.out.println("The Message is: "+intent.getStringExtra("MyMessage"));
    CharSequence text = "Your tax amount due period";
    CharSequence contentTitle = "Tax Toolbox";

    long when = System.currentTimeMillis();

    intent = new Intent(context, MenuPageActivity.class); // here i am calling activity
    intent.putExtra("sixMonth", "sixMonth");
    intent.putExtra("messageSixMonth", contentText);
    PendingIntent contentIntent = PendingIntent.getActivity(context, 1, intent, PendingIntent.FLAG_UPDATE_CURRENT);

    notification = new Notification(icon,text,when);

    long[] vibrate = {0,100,200,300};
    notification.vibrate = vibrate;  // To vibrate the Device

    notification.ledARGB = Color.RED;
    notification.ledOffMS = 300;
    notification.ledOnMS = 300;

    notification.defaults |= Notification.DEFAULT_LIGHTS;
    //notification.flags |= Notification.FLAG_SHOW_LIGHTS;

    notification.setLatestEventInfo(context, contentTitle, contentText, contentIntent);
    notificationManager.notify(com.project.TaxToolbox.NotificationConstants.NOTIFICATION_ID_SIX_MONTH, notification);


}

现在,在该活动的 onCreate() 上,您必须确定它是否被 Notification 调用。

就像:

  NotificationManager notificationManager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);

    System.out.println("The Extra for twoMonth is:  "+getIntent().hasExtra("twoMonth"));
    System.out.println("The Extra for sixMonth is:  "+getIntent().hasExtra("sixMonth"));
    System.out.println("The Extra for EveryMonth is:  "+getIntent().hasExtra("everyMonth"));



    if(getIntent().hasExtra("sixMonth")){
        notificationManager.cancel(NotificationConstants.NOTIFICATION_ID_SIX_MONTH);
        final AlertDialog alert3 = new AlertDialog.Builder(MenuPageActivity.this).create();
        alert3.setTitle("Tax Toolbox");
        alert3.setMessage(getIntent().getExtras().getString("messageSixMonth"));
        alert3.setButton("OK", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
                return;
            }
        });
        alert3.setIcon(R.drawable.app_icon);
        alert3.show();

// 在这里你可以做更多的事情或关闭活动。}

不确定,但可能对您有帮助。

如果对您有帮助,请随时发表评论。

于 2013-02-07T13:11:00.820 回答
0

ActivityManager 类可以为您提供当前的前台活动(即使它不是来自您的应用程序)。getRunningTasks方法会给你一个正在运行的任务列表,列表的第一个元素是最近启动的活动。不幸的是,这个方法只会给你一个最近任务信息类型的对象,不是活动本身,所以没有办法调用它的完成()方法,我相信:/

另一方面,如果您想从您的应用程序中关闭当前活动,您可以在个人类上实现一个静态变量,每个活动将在其 onResume() 方法中设置该变量。这样,您将始终知道当前活动是什么活动。但我想这不是你要找的。

编辑: getRunningTasks 仅用于调试目的,如文档所述。

于 2013-02-04T00:15:00.937 回答
0

正如其他答案所建议的那样,您可以简单地在广播接收器代码中的活动上调用 finish() ,或者您甚至可以自己触发后退按钮按键事件。

this.dispatchKeyEvent(new Keyevent(ACTION_DOWN, KEYCODE_BACK)); 
于 2013-02-06T15:33:59.477 回答
0

创建一个通用 Activity 类并从所有 Activity 扩展这个通用类,这样您就可以拥有一个集中的代码。在活动的 onStart 中注册广播接收器并在 onStop 中取消注册,这样只有一个活动,可见的活动将被注册用于广播意图。

示例代码:

public class BaseActivity extends Activity {

    /*
     * (non-Javadoc)
     * 
     * @see android.app.Activity#onCreate(android.os.Bundle)
     */
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        registerReceiver(receiver, new IntentFilter(YOUR_INTENT_FILTER)); 
    }
    /*
     * (non-Javadoc)
     * 
     * @see android.app.Activity#onStop()
     */
    protected void onStop(){
        unregisterReceiver(receiver);
    }

    /*
     * (non-Javadoc)
     * 
     * @see android.app.Activity#onStart()
     */
    protected void onStart(){
        super.onStart();
        registerReceiver(receiver, new IntentFilter(YOUR_INTENT_FILTER)); 
    }

    private BroadcastReceiver receiver = new BroadcastReceiver() {

        /*
         * (non-Javadoc)
         * 
         * @see
         * android.content.BroadcastReceiver#onReceive(android.content.Context,
         * android.content.Intent)
         */
        @Override
        public void onReceive(Context context, Intent intent) {
            onBackPressed();//on back pressed simply calls finish()
        }
    };
} // End of BaseActivity 
// End of File
于 2013-02-08T05:59:13.873 回答
-1

finish();在你完成课堂上的所有任务后onReceive()放置如下BroadcastReceiver

 @Override
 public void onReceive(Context context, Intent intent) {
    // Do all the tasks onReceive of BroadCast Receiver
    finish(); // This finishes the current activity here....   
}
于 2013-02-08T08:55:12.793 回答