H5跳转App的某个指定页面
程序员文章站
2022-05-31 10:50:12
...
H5链接打开原生App并跳转到指定界面
因为目前项目需要先登录才能够使用,所以跳转时候需要判断是否登录,先上图,有图有真相
app未启动情况下,点击链接跳转至MainActivity并传递参数id,但是判断没有登录就跳转至LoginActivity,并保留要跳转的界面id,为了登录成功后再跳转
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地址
推荐阅读