欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

H5跳转App的某个指定页面

程序员文章站 2022-05-31 10:50:12
...

H5链接打开原生App并跳转到指定界面

因为目前项目需要先登录才能够使用,所以跳转时候需要判断是否登录,先上图,有图有真相
app未启动情况下,点击链接跳转至MainActivity并传递参数id,但是判断没有登录就跳转至LoginActivity,并保留要跳转的界面id,为了登录成功后再跳转
H5跳转App的某个指定页面
app未启动情况下,从登录界面登录成功跳转至MainActivity,判断是否有保留的跳转的id,有的话就跳转,此时activity栈中从下到上分别为MainActivity->OtherActivity
H5跳转App的某个指定页面
app登录情况下,点击跳转链接,走OnNewIntent方法,直接跳转至OtherActivity
H5跳转App的某个指定页面
具体步骤如下:
- 将清单文件中首页的exported属性改为true
- 对首页添加intent filter,设置scheme和host等属性
- h5 window.location.href = scheme://host/pathPrefix
- 判断登录逻辑
- 登录状态下,singleTask,onNewIntent
- 未登录状态,保留需要跳转的界面id,并跳转到登录界面,登录成功后在首页获取到要跳转到id进行跳转

清单文件代码:

<?xml version="1.0" encoding="utf-8"?>
<manifest package="com.hj.test"
          xmlns:android="http://schemas.android.com/apk/res/android">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity
            android:name=".MainActivity"
            android:launchMode="singleTask"
            android:exported="true">
            <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="host"
                    android:pathPrefix="/pathPrefix"
                    android:scheme="scheme"/>
            </intent-filter>
        </activity>

        <activity android:name=".LoginActivity"
            android:launchMode="singleTask">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>

                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>

        <activity android:name=".OtherActivity"/>
    </application>

</manifest>

Application文件代码:

package com.hj.test;

import android.app.Application;


public class App extends Application {

    private static boolean isLogin = false;

    private static int id = -1;//需要跳转的acitivity的id

    @Override
    public void onCreate() {
        super.onCreate();
        isLogin = false;
        id = -1;
    }

    public static boolean isLogin() {
        return isLogin;
    }

    public static void setLogin(boolean islogin) {
        App.isLogin = islogin;
    }

    public static void setId(int id){
        App.id = id;
    }

    public static int getId(){
        return id;
    }
}

MainActivity文件代码:

package com.hj.test;

import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {

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

        if(!App.isLogin()){//没有登录就跳转到登录界面
            App.setId(123);//缓存需要跳转的页面,模拟id和OtherActivity对应
            finish();
            startActivity(new Intent(this,LoginActivity.class));
        }else{
            if(-1!=App.getId()){//登录成功后查看是否有需要跳转页面的缓存
                startActivity(new Intent(this,OtherActivity.class));
                App.setId(-1);//跳转到页面后,将缓存删掉
            }
        }

        setContentView(R.layout.activity_main);
    }

    @Override
    protected void onResume() {
        super.onResume();

        Uri uri = getIntent().getData();
        if(uri!=null){
            String id = uri.getQueryParameter("id");
            startActivity(new Intent(this,OtherActivity.class));
            App.setId(-1);//跳转到页面后,将缓存删掉
        }

    }

    /**
     * 首页是singleTask的,在MainActivity已经初始化的情况下,h5跳转进入MainActivity会触发onNewIntent方法
     * @param intent
     */
    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);

        Uri uri = intent.getData();
        if(uri!=null){
            String id = uri.getQueryParameter("id");
            startActivity(new Intent(this,OtherActivity.class));
            App.setId(-1);//跳转到页面后,将缓存删掉
        }
    }

}

LoginActivity文件代码:

package com.hj.test;

import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;

public class LoginActivity extends AppCompatActivity {

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

        if (!isTaskRoot()) {
            finish();
            return;
        }

        setContentView(R.layout.activity_login);
    }

    public void login(View view){
        App.setLogin(true);//设置登录成功
        finish();
        startActivity(new Intent(LoginActivity.this,MainActivity.class));
    }
}

OtherActivity文件代码:

package com.hj.test;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;

public class OtherActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_other);
    }

}

Html5关键代码:

window.location.href="scheme://post/pathPrefix?id=123";//这里id对应某一个需要跳转的activity

github地址:点击这里跳转至github地址