H5跳转App的某个指定页面

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/nongminkouhao/article/details/81462513

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

因为目前项目需要先登录才能够使用,所以跳转时候需要判断是否登录,先上图,有图有真相
app未启动情况下,点击链接跳转至MainActivity并传递参数id,但是判断没有登录就跳转至LoginActivity,并保留要跳转的界面id,为了登录成功后再跳转
app未启动情况下
app未启动情况下,从登录界面登录成功跳转至MainActivity,判断是否有保留的跳转的id,有的话就跳转,此时activity栈中从下到上分别为MainActivity->OtherActivity
登录成功后跳转
app登录情况下,点击跳转链接,走OnNewIntent方法,直接跳转至OtherActivity
登录情况下
具体步骤如下:
- 将清单文件中首页的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地址

猜你喜欢

转载自blog.csdn.net/nongminkouhao/article/details/81462513