Androidプロジェクトはschemeを通じてWebViewでアプリケーションを開きます

7444 ワード

  • 需要:Aアプリケーションの1つのActivityにWebViewが含まれており、WebViewはサードパーティのアプリケーションのデータをロードしており、そのWebViewページでサードパーティのアプリケーションBを開きたい、すなわちWebViewでイベントまたはリンクをクリックしてサードパーティのアプリケーションBを開く.

  • 1.schemeプロトコルの定義と用途と需要の実現構想
    1.Androidのschemeはページ内ジャンププロトコルであり、非常に良い実現メカニズムである.2.自分のschemeプロトコルを定義することで、appの各ページを簡単にジャンプすることができます.3.h 5ページでリンクを定義し、指定したactivityページにジャンプします.クライアントはh 5ページにurlschemeを登録し、ブラウザからactivityを起動するためにschemeプロトコルによって使用する.4.使用シーンのまとめ:クライアントはサービス側から送信されたurlに基づいて指定されたページにジャンプする.h 5ページから対応するactivityページにジャンプします.appはurlに基づいて別の指定されたappページにジャンプします(大手企業は、人気のあるリンクを通じて別のappにジャンプします).
    2.androidでのschemeの使用場所
    
    		
                
                    
                    
                
                
                    
                    
                    
                    
                
            
    
    

    3.schemeプロトコル定義はhttpプロトコルと類似しており,いずれも標準的なURI構造である.
    [scheme:][//host:port][path][?query][fragment]scheme:プロトコル名-必須host:プロトコルアドレス-必須port:プロトコルのポート、path:プロトコルパスを記入せず、複数のqueryを使用可能/接続可能:携帯パラメータ使用可能&複数のfragmentへの接続:アンカーポイント
    4.demoの例
  • 4.1.アプリケーションAのコード
  • //1.   h5    ,  :/main/assets/test.html
    
    
    
    
        
        function startApp(params)
        {
            window.location.href = params
        }
        
    
    
        
    
    
    //2.activity_main.xml
    
    
        
        
    
    
    
    //3.MainActivity 
    import android.os.Bundle;
    import android.support.v7.app.AppCompatActivity;
    import android.webkit.WebView;
    
    public class MainActivity extends AppCompatActivity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            WebView webView = findViewById(R.id.webview);
            webView.loadUrl("file:///android_asset/test.html");
            webView.getSettings().setJavaScriptEnabled(true);
            //         ,    setWebViewClient  ,              ,
            //            ,       ,   。
        }
    }
    

    4.2.アプリケーションBのコード
    //1.AndroidManifest.xml
    
            
                
                    
                    
                
                
                
                    
                    
                    
                    
                    
                    
                    
                
            
    
        
    //2.activity_main.xml
    
    
    
        
    
    
    //3.MainActivity 
    import android.content.Intent;
    import android.net.Uri;
    import android.os.Bundle;
    import android.support.v7.app.AppCompatActivity;
    import android.util.Log;
    
    public class MainActivity extends AppCompatActivity {
    
        private String TAG = "TAG";
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            Intent intent = getIntent();
            Log.e(TAG, "scheme:"  + intent.getScheme());
            Uri uri = intent.getData();
            if (uri != null) {
                //    scheme   
                Log.e(TAG, "scheme: " + uri.getScheme()); 
                //    scheme  host
                Log.e(TAG, "host: " + uri.getHost());     
                //    scheme    
                Log.e(TAG, "path: " + uri.getPath());     
                //    scheme    ,?     
                Log.e(TAG, "queryString: " + uri.getQuery()); 
                //    scheme    param   
                Log.e(TAG, "queryParameter: " + uri.getQueryParameter("param")); 
            }
        }
    }
    
  • 4.3.注意事項
  • ステップ4.2、AndroidManifest.xmlファイルでは、MainActivityにintent-filterを新規作成し、launcherが開いているfilterに直接書くとappアイコンが消えます(categoryがDEAFAULTに上書きされているため)
  • 4.4.intentインスタンスには、対応するscheme情報を取得するための次の方法がある:
  • getScheme() :  Uri  scheme  :[scheme:]
    getSchemeSpecificPart() :  Uri  scheme-specific-part:  :[//host:port][path]
    getFragment() :  Uri  Fragment  :[#fragment]
    getAuthority() :  Uri Authority  :[//host:port]
    getPath() :  Uri path  :[path]
    getQuery() :  Uri  query  :[?query]
    getHost() :  Authority  Host   
    getPost() :  Authority  Port   
    List< String> getPathSegments() :     Path         ,           
    getQueryParameter(String key) :  query    key       
    

    5.まとめ
  • 実際のプロジェクトにロードされているのは特定のWebページです.パラメータをサードパーティアプリケーションに渡す必要がある場合は、CookieManagerオブジェクトを介して渡すデータを書き込み、h 5ページで動的にパラメータを渡すことができます.たとえば、上記の静的ページでstartApp(params)メソッドのパラメータparamsをdefiに割り当てます.nedscheme://main.definedhost?canshu1=value1&canshu2=value2を選択すると、静的h 5ページの変動のコードは、
  • に変更されます.
    
    
  • このとき、起動されたappでは、canshu 1およびcanshu 2にキーが適用された値value 1およびvalue 2、すなわち伝達された値を取得することができる.
  • 最後のまとめ:この記事では、WebViewでサードパーティ製アプリケーションを開く実装方法について説明し、パラメータを渡すことができます.不足点があれば、皆さん、ご指摘ください.役に立つと思います.いいねを押してください.