我需要从广播接收器关闭当前活动。我不确定如何从中调用完成,也许有一种方法可以模拟“返回”键按键。只要能完成工作,任何实现都可以。
@Override
public void onReceive(Context context, Intent intent) {
// How can I finish the current activity here?
}
在你的广播接收器上写:
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);
}
}
从您的评论中假设 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()。
你可以简单地打电话this.finish();
尝试使用:
Intent i = new Intent(context,intent.getClass());
按照 gezdy 关于如何在 android 中获取当前前台活动上下文的说明进行操作?以确保您可以从应用程序的任何位置获取对当前活动的引用。
从那里您可以调用 .finish() 来关闭当前活动。
不确定这是否对您有帮助,但它曾经帮助过我一次,我认为这里的情况相同,所以我为您回答。
每当广播接收器接到电话时,您都可以通过单击该广播消息导航到任何活动。
就像:
@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();
// 在这里你可以做更多的事情或关闭活动。}
不确定,但可能对您有帮助。
如果对您有帮助,请随时发表评论。
ActivityManager 类可以为您提供当前的前台活动(即使它不是来自您的应用程序)。getRunningTasks方法会给你一个正在运行的任务列表,列表的第一个元素是最近启动的活动。不幸的是,这个方法只会给你一个最近任务信息类型的对象,而不是活动本身,所以没有办法调用它的完成()方法,我相信:/
另一方面,如果您想从您的应用程序中关闭当前活动,您可以在个人类上实现一个静态变量,每个活动将在其 onResume() 方法中设置该变量。这样,您将始终知道当前活动是什么活动。但我想这不是你要找的。
编辑: getRunningTasks 仅用于调试目的,如文档所述。
正如其他答案所建议的那样,您可以简单地在广播接收器代码中的活动上调用 finish() ,或者您甚至可以自己触发后退按钮按键事件。
this.dispatchKeyEvent(new Keyevent(ACTION_DOWN, KEYCODE_BACK));
创建一个通用 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
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....
}