从浏览器重定向到Android应用程序

5
我目前正在开发一款安卓应用程序,通过HTML请求向服务器请求信息,并获得参数字符串作为返回结果。这个过程发生在启动过程中,以便第一次运行时配置应用程序。
为了向服务器发送请求,我从我的应用程序的主活动的OnCreate方法中调用以下内容:
String URL = "http://myserver.mydomain.com/users/start";            
Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(URL));
startActivity(browserIntent);

服务器是一个rails应用程序,它获取所需的参数值并使用以下语句将其重定向回应用程序:
redirect_to "http://myappname.mydomain.com/?#{mobile_params.to_query}"

我在AndroidManifest.xml中为处理从服务器返回的参数的活动创建了一个意图过滤器。意图过滤器如下:

    <activity
        android:name=".StartFromUriActivity"
        android:launchMode="singleTop"
        android:noHistory="true"
        android:screenOrientation="behind"
        android:theme="@style/NoTitle" 
        android:exported="true" >
        <intent-filter>
            <data android:scheme="http" android:host="myappname.mydomain.com" />
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
             <category android:name="android.intent.category.BROWSABLE" />
        </intent-filter>
    </activity>

最后,我的StartFromUriActivity.java的前几行如下:

public class StartFromUriActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Uri URIdata = getIntent().getData();
        if(URIdata != null) {
            parameter1value = URIdata.getQueryParameter("param1");
        }
    finish();
    }
}

除了一个例外,这一切都很好地运行着。应用程序打开浏览器,将URI发送到服务器,服务器将其重定向回应用程序,并传回所需参数的值,意图过滤器指向活动,参数被正确读取。唯一的问题是,浏览器窗口仍然在前台,我必须手动关闭它。我已经尝试了我能想到的一切来使我的应用程序来到前台并成功关闭或将浏览器置于后台,但都没有成功。我错过了什么,导致我的应用程序无法正确地进入前台呢?


我认为android:allowTaskReparenting="true"可以解决这个问题?我不是完全确定,但是Android文档中谈到了你所描述的问题。 - Dan Schnau
谢谢dsschnau,这并没有解决问题,但是它指引了我正确的方向。 - Blaze
太棒了!很高兴我能帮上一点忙。 - Dan Schnau
尝试了一种从URI重定向到我的应用程序的方法,但没有成功。后来我发现了这个方法,它与之前的方法几乎相同,但对我起作用了。http://simonwdixon.wordpress.com/2011/05/06/launching-and-android-app-from-the-android-webkit-browser/ - mario595
1个回答

5
我尝试了dsschnau的建议,在AndroidManifest.xml中的活动中添加android:allowTaskReparenting="true"。但这并没有解决问题,因此我尝试添加android:parentActivityName=".MainActivity"和android:taskAffinity="myapp"以使reparenting具有明确的目标,但仍然没有成功。
我意识到问题在于StartFromUriActivity.OnCreate中的finish()语句结束了该活动,并且它正确地返回到堆栈中的下一个活动——浏览器。解决方案是在finish()语句之前添加以下行。
    Intent intent = new Intent(this, MainActivity.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    startActivity(intent);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接