5

所以我试图获取一个被调用到我的应用程序中的 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 开发人员,所以我可能有一个我不认识的简单问题。我将把它传递到我的 PhoneGap 应用程序中,sendJavascript但作为一个 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 应用程序的帖子后,没有一个非常强大或根本无法工作,我将发布我的完整解决方案,并希望有人觉得它有用。

第一步: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函数中(而不是 in 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有关覆盖的解释,请参阅接受的答案。

4

2 回答 2

21

尝试覆盖onNewIntent. 问题是getIntent返回Intent开始的Activity,但不是最近的。但是您可以使用setIntent方法覆盖它。

@Override 
protected void onNewIntent(Intent intent) { 
    super.onNewIntent(intent); 
    setIntent(intent); 
}
于 2013-03-13T16:56:05.740 回答
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);
    }

希望能帮助到你。

于 2013-07-22T11:37:17.133 回答