所以我试图将一个URL调用到我的应用程序中,但在打开之后,它似乎总是null
无论我做什么。
以下是我的清单的相关部分:
<activity android:name="myapp" android:label="@string/app_name"
android:theme="@android:style/Theme.Black.NoTitleBar"
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale"
android:launchMode="singleTask">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<data android:scheme="myapp" />
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
</intent-filter>
</activity>
这是我的java:
@Override
public void onStart() {
super.onStart();
final Intent intent = getIntent();
Uri url = intent.getData();
Log.e("myLog", "Url = " + url);
}
日志输出“Intent = null”,我没有错误。
我不是一个java开发人员所以我可能有一个我不认识的简单问题。我将通过sendJavascript
将其传递到我的PhoneGap应用中,但作为PhoneGap应用似乎与此问题无关。
编辑:
当我记录<intent-filter>
时,我似乎只获得了第一个intent
。这是日志:
03-13 12:36:18.593: E/MyAppLog(13793): Intent=Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 cmp=com.wd.myapp/.myapp (has extras) }
解决方案:
关于如何实施URL方案以打开您的PhoneGap应用程序的几十篇帖子,并且它们都不是非常强大或完全没有工作之后,我将发布我的完整解决方案并希望有人发现它有用。< / p>
第一步:AndroidManifest.xml - 将此<intent-filter>
添加到您的<activity>
,将“urlScheme”更改为您喜欢的任何内容。在这种情况下,您可以单击指向urlScheme:///?key = val的链接,它将打开该应用程序。
<intent-filter>
<data android:scheme="urlScheme" />
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
</intent-filter>
第二步:myApp.java - 在onCreate
下添加以下内容。如果您使用的是singleTask
,请务必将intent
逻辑放在onStart
函数中(而不是onCreate
,因为其他人已经大肆宣传),因为这将允许您链接到您的应用程序是否已经运行。
@Override
public void onStart() {
super.onStart();
final Intent intent = getIntent();
String url = intent.getDataString();
if(url != "" && url != null) {
super.sendJavascript("setTimeout(function() { handleOpenURL('" + url + "'); },1);");
}
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent); setIntent(intent);
}
有关onNewIntent
覆盖的解释,请参阅接受的答案。
答案 0 :(得分:17)
尝试覆盖onNewIntent
。问题是getIntent
会返回Intent
的{{1}},而不是最新的Activity
。但您可以使用setIntent
方法覆盖它。
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);
}
答案 1 :(得分:0)
扩展原始答案,以防您的主要活动启动另一项活动。然后,当您从已启动的活动返回主要活动时,它可能会一次又一次地启动活动的无限循环。
这是代码
public void onStart(){
super.onStart();
Intent intent = getIntent();
Uri data = intent.getData();
if (data != null) {
// explicitly set intent data to null
// so on next launch, from same lifecycle of activity
// it does not restart the Activity Z.
intent.setData(null);
Intent activityZ = new Intent(MyActivity.this, ActivityZ.class);
businessViewActivity.putExtra("url", data.toString());
startActivity(activityZ);
}
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);
}
希望它有所帮助。