我遇到了与 OP 相同的问题,但有一个解决方案并不意味着放弃使用SearchView
. 这不是完美的解决方案,但它相当干净并且似乎运行良好。
正如OP所说...
当我尝试从它自己的类中启动一个新的活动实例时,Android 不尊重 FLAG_ACTIVITY_NEW_TASK 并且没有将新任务推送到堆栈上
...所以我的解决方案是通过中介活动。为此,我创建了一个DummyActivity
类,它基本上采用原始意图并将其转发到您的目标活动。
所以,从我原来的活动中,而不是打电话...
Intent destinationIntent = new Intent(getActivity(), DestinationActivity.class);
startActivity(destinationIntent);
...我打电话...
/*
* Create the intent as normal, but replace our destination Activity with DummyActivity
*/
Intent dummyIntent = new Intent(getActivity(), DummyActivity.class);
/*
* This will make it so that if user clicks back from the next activity, they won't be shown DummyActivity
*/
dummyIntent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
/*
* Tell DummyActivity about the destination Activity
*/
dummyIntent.putExtra(DummyActivity.EXTRA_DESTINATION_ACTIVITY, YourDestinationActivity.class); //IMPORTANT - the destination Activity must implement Serializable
/*
* If you want, you can add any other extras to dummyIntent (which will be passed through to the destination activity). Launch DummyActivity.
*/
startActivity(dummyIntent);
在我的清单中,DesinationActivity 被定义为 singleTop。
你应该需要的唯一另一件事是 DummyActivity 类,它不需要任何主要的定制......
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
public class DummyActivity extends Activity {
public static final String EXTRA_DESTINATION_ACTIVITY = "uk.co.mobilewebexpert.EXTRA_DESTINATION_ACTIVITY";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//setContentView(R.layout.activity_dummy);
Intent intent = getIntent();
/*
* Get destination activity info
*/
@SuppressWarnings("unchecked")
Class<Activity> destinationActivity = (Class<Activity>) intent.getSerializableExtra(EXTRA_DESTINATION_ACTIVITY);
Bundle destinationActivityExtras = intent.getExtras();
/*
* Launch destination activity
*/
Intent destinationActivityIntent = new Intent(this, destinationActivity);
destinationActivityIntent.putExtras(destinationActivityExtras);
destinationActivityIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(destinationActivityIntent);
}
/**
* Override super.onNewIntent() so that calls to getIntent() will return the latest
* intent, rather than the first intent.
*/
@Override
public void onNewIntent(Intent intent){
super.onNewIntent(intent);
setIntent(intent);
}
}
希望这也对你有用。欢迎提出建议。干杯。