我有Activity
,可以直接从浏览器启动,调用网址。
活动代码:
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Uri data = getIntent().getData();
Log.d(getClass().getName(), "onCreate data=" + data);
getIntent().replaceExtras(new Bundle());
getIntent().setAction("");
getIntent().setData(null);
getIntent().setFlags(0);
if (data != null && isValidUrl(data)) {
// open some special fragment
} else {
// open main fragment
}
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.d(MainActivity.class.getName(), "onDestroy");
}
//...
}
应用程序清单代码:
...
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
<data
android:host="example.com"
android:pathPrefix="/"
android:scheme="http"/>
</intent-filter>
</activity>
...
此代码完美无缺。当我使用链接(http://example.com/somepage.html
)从浏览器打开应用程序时,我有这个输出:
D/com.package.MainActivity: onCreate data=http://example.com/somepage.html
但如果我离开应用程序(使用后退按钮)并再次打开应用程序,从最近的菜单中,我得到相同的结果:
D/com.package.MainActivity: onDestroy
D/com.package.MainActivity: onCreate data=http://example.com/somepage.html
我想在方法onCreate
中清除意图数据。或者从最近的菜单启动应用程序时是否有办法检测?
UPD: 我试着这样做:
@Override
protected void onDestroy() {
super.onDestroy();
getIntent().replaceExtras(new Bundle());
getIntent().setAction("");
getIntent().setData(null);
getIntent().setFlags(0);
Log.d(MainActivity.class.getName(), "onDestroy");
}
但它没有帮助。
答案 0 :(得分:7)
通过以下代码删除 intent.getData():
修改1:
Uri data = getIntent().getData();
Log.d(getClass().getName(), "onCreate data=" + data);
if (data != null && isValidUrl(data)) {
// open some special fragment
} else {
// open main fragment
}
getIntent().setData(null);
编辑2:
getIntent().replaceExtras(new Bundle());
getIntent().setAction("");
getIntent().setData(null);
getIntent().setFlags(0);
希望这会对你有所帮助。
答案 1 :(得分:4)
这里有一个很老的帖子,但万一其他人正在寻找这个:
您可以通过检查标志FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY
来检查您的意图是否是由于应用程序是从最近列表启动而发送的 if ((getIntent().getData() != null) && ((getIntent().getFlags() & Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY) == 0)) {
//Handle the url passed through the intent
} else {
//proceed as normal
}
答案 2 :(得分:2)
您想要这样做的方式违背了Android系统的原则。 Android设计为Intent
打开Activity
,然后如果您想从“最近”菜单中打开此Activity
,则会收到相同的意图。
我只是猜测如果你使用one-Activity-many-fragments方法,那么你会看到它的一个缺点。 Android Intent系统的设计方式是使用One Screen - One Activity方法,这是最佳实践。
如果我错了,而你还有其他一些案例,那么了解它会非常有趣。然后您可以考虑如何重新设计应用程序以满足您的需求。
答案 3 :(得分:1)
您可以存储意图的哈希值,并在每次应用程序获得焦点时比较该哈希值,而不是更改意图数据。通过这种方式,您可以查看是否存在新意图。
示例:
int currentIntent = getIntent().hashCode();
if (lastIntent != currentIntent) {
// do stuff
}
答案 4 :(得分:0)
您可以调用以下方法来清除意图
getIntent().removeExtra("key");
只需更换&#34; key&#34;使用从源传递的Intent名称。
答案 5 :(得分:0)
在你的onCreate方法中
if (data != null && isValidUrl(data)) {
// open some special fragment
} else {
// open main fragment
}
更改为
if (data != null && isValidUrl(data)) {
// open some special fragment
getIntent().setData(null);
setIntent(getIntent()); //This will set the new intent to have no data,
//so future launches won't relaunch the data url.
} else {
// open main fragment
}