Activity跳轉新方法(學習筆記)

1、Java 調用 js 裏面的函數、效率並不是很高、估計要200ms左右吧、做交互性很強的事情、這種速度很難讓人接受、而js去調Java的方法、速度很快、50ms左右、所以儘量用js調用Java方法
2、Java 調用 js 的函數、沒有返回值、調用了就控制不到了
3、Js 調用 Java 的方法、返回值如果是字符串、你會發現這個字符串是 native 的、轉成 locale 的才能正常使用、使用 toLocaleString() 函數就可以了、不過這個函數的速度並不快、轉化的字符串如果很多、將會很耗費時間
4、Android4.2以下的系統存在着webview的js對象注入漏洞

所以出於這些原因,我們並未採用這種方式用於Native與webview交互,而是要介紹核武器—scheme,採用scheme 的方式。

scheme格式

先來個完整的URL Scheme協議格式:

xl://goods:8888/goodsDetail?goodsId=10011002
通過上面的路徑 Scheme、Host、port、path、query全部包含,基本上平時使用路徑就是這樣子的。

  • xl代表該Scheme 協議名稱
  • goods代表Scheme作用於哪個地址域
  • 8888代表該路徑的端口號
  • goodsDetail代表Scheme指定的頁面
  • goodsId代表傳遞的參數

舉個栗子:

(該 URL 會調起車輛詳情頁):uumobile://mobile/carDetail?car_id=123456,其中 scheme 爲 uumobile,host 爲 mobile,relativePath 爲 /carDetail,query 爲 car_id=123456。
在什麼場景使用?

下面介紹一下本人曾經常用的場景:

  • 其他應用想要調用你APP的某個頁面
  • 自己的H5頁面想要調用native的某個頁面
  • 服務器下發路徑,客戶端根據服務器下發跳轉路徑跳轉相應的頁面
  • APP端收到服務器端下發的PUSH通知欄消息,根據消息的點擊跳轉路徑跳轉相關頁面

scheme的使用

        <activity android:name=".activity.ProcessActivity">
            <intent-filter>
                <data
                    android:host="open.everystudy.app"
                    android:scheme="everystudy">
                </data>

                <category android:name="android.intent.category.DEFAULT"/>
                <category android:name="android.intent.category.BROWSABLE"/>

                <action android:name="android.intent.action.VIEW"/>
            </intent-filter>
        </activity>

注意scheme、host名字隨便取,協商好就行。
接下來看一下代碼處理:

public class ProcessActivity extends AppCompatActivity {

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

    void distribute() {
        Uri uri = getIntent().getData();
        if (uri == null)
            finish();
        else {
            String path = uri.getPath();
            if (!TextUtils.isEmpty(path)) {
                jump(path, uri);
            }
            finish();
        }
    }

    void jump(String path, Uri uri) {
        switch (path) {
            case "/jump":
                String msg = uri.getQueryParameter("index");
                LogUtils.e(msg);
//                Intent intent = new Intent(this, JumpActivity.class);
//                intent.putExtra("index", msg);
//                startActivity(intent);
                JumpActivity_.intent(this).extra("index", msg).start();
        }
    }
}

跳轉

@EActivity(R.layout.activity_main)
public class MainActivity extends AppCompatActivity {

    //everystudy://open.everystudy.app/jump?index=jumptest
    @Click(R.id.btn_jump)
    void clickBtn() {
        String action = "everystudy://open.everystudy.app/jump?index=jumptest";
        Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(action));
        startActivity(intent);
    }
    @Click(R.id.btn_jump_web)
    void clickWebBtn() {
        Intent intent = new Intent(this, WebViewActivity.class);
        startActivity(intent);
    }
}
public class WebViewActivity extends AppCompatActivity {

    WebView webView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_web_view);

        webView = (WebView) findViewById(R.id.webview);
        webView.loadUrl("file:///android_asset/" + "index.html");
    }
}
<html>

  <body style="background-color:yellow">
      <p style="font-size:20px;text-align:center;">
        <h1>web跳轉Activity</h1>
      </p>

      <p style="font-size:20px;text-align:center;" >
        <a href="everystudy://open.everystudy.app/jump?index=jumptes">點擊跳轉</a>
      </p>
  </body>
</html>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章