Android Scheme詳解

Uri的格式:scheme://host:port/path or pathPrefix or pathPattern

說到scheme之前一直很少接觸锹雏,基本上沒有使用過脸狸,最近項(xiàng)目中使用到了scheme躬窜,研究了一下鼎俘,scheme是下data標(biāo)簽的一個(gè)屬性妥粟,通過scheme以及action的設(shè)置可以進(jìn)行頁面的跳轉(zhuǎn)渔彰。

當(dāng)我們通過Intent啟動(dòng)一個(gè)Activity的時(shí)候笋婿,一般分為顯式跳轉(zhuǎn)和隱式跳轉(zhuǎn)誉裆,而隱式跳轉(zhuǎn)我們通過setAction方法就可以實(shí)現(xiàn),但有時(shí)我們需要通過設(shè)置URi的方式來進(jìn)行頁面的跳轉(zhuǎn)缸濒,隱式啟動(dòng)則是不明確指定啟動(dòng)哪個(gè)Activity或者Service足丢,而是通過設(shè)置Action元镀、Data、Category霎桅,讓系統(tǒng)來篩選出合適的目標(biāo)栖疑。

例如:撥打電話:

Intent intent = new Intent(Intent.ACTION_DIAL,Uri.parse(“tel:10086”));
startActivity(intent);

系統(tǒng)接收到隱式啟動(dòng)請(qǐng)求后,會(huì)根據(jù)系統(tǒng)中各個(gè)Activity在AndroidManifest.xml文件中聲明的來比較和判斷是否匹配當(dāng)前的Intent請(qǐng)求的滔驶。

一 . 現(xiàn)在模擬一個(gè)場(chǎng)景,點(diǎn)擊首頁MainActivity跳轉(zhuǎn)到secondActivity遇革,點(diǎn)擊secondActivity跳轉(zhuǎn)到MainActivity(通過uri的方式),在跳轉(zhuǎn)到MainActivity的時(shí)候揭糕,通過配置scheme萝快,來實(shí)現(xiàn)模擬首頁按鈕的點(diǎn)擊效果

1.首先在AndroidManifest.xml中為MainActivity配置跳轉(zhuǎn)參數(shù)。

<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:scheme="@string/scheme" />
</intent-filter>

2 . String.xml文件

<string name="scheme">myscheme</string>

3.MainActivity.java

public class MainActivity extends Activity
{
    private TextView textView;

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

        initView();
    }

    /**
     * 
     * <初始化組件>
     * <功能詳細(xì)描述>
     * @see [類著角、類#方法揪漩、類#成員]
     */
    private void initView()
    {
        textView = (TextView)findViewById(R.id.main_to_jump);

        textView.setOnClickListener(new OnClickListener()
        {

            @Override
            public void onClick(View v)
            {
                // 顯式跳轉(zhuǎn)
                Intent intent = new Intent(MainActivity.this, SecondActivity.class);
                startActivity(intent);
            }
        });
    }

    @Override
    protected void onNewIntent(Intent intent)
    {
        super.onNewIntent(intent);
        if (null != intent)
        {
            handlerIntent(intent);
        }
    }

    /**
     * 
     * <處理uri數(shù)據(jù),模擬點(diǎn)擊>
     * <功能詳細(xì)描述>
     * @param intent
     * @see [類、類#方法吏口、類#成員]
     */
    private void handlerIntent(Intent intent)
    {
        if (null != intent && null != intent.getAction() && null != intent.getScheme() && intent.getScheme().equals(getResources().getString(R.string.scheme)))
        {
            Uri schemeUri = intent.getData();

            String schemID = schemeUri.getAuthority();

            // 模擬點(diǎn)擊
            switch (schemID)
            {
                case Contants.PRODUCT:
                    Toast.makeText(MainActivity.this, "通過scheme--點(diǎn)擊了[" + Contants.PRODUCT + "]", Toast.LENGTH_SHORT).show();
                    break;
                case Contants.PASSWORD:
                    Toast.makeText(MainActivity.this, "通過scheme--點(diǎn)擊了[" + Contants.PASSWORD + "]", Toast.LENGTH_SHORT).show();
                    break;
                case Contants.SHARE:
                    Toast.makeText(MainActivity.this, "通過scheme--點(diǎn)擊了[" + Contants.SHARE + "]", Toast.LENGTH_SHORT).show();
                    break;
                default:
                    break;
            }
        }
    }
}
···

備注:onNewIntent是在該實(shí)例已經(jīng)存在的情況下奄容,才會(huì)調(diào)用,關(guān)于這個(gè)請(qǐng)點(diǎn)擊:Android:onNewIntent()觸發(fā)機(jī)制及注意事項(xiàng)
···
4 . SecondActivity.java

[code]public class SecondActivity extends Activity
{
    private TextView textView;

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

        initView();
    }

    private void initView()
    {
        textView = (TextView)findViewById(R.id.jump_to_main);
        textView.setOnClickListener(new OnClickListener()
        {

            @Override
            public void onClick(View v)
            {
                Intent intent = new Intent();
                intent.setAction(Contants.MAIN_ACTION);
                intent.setData(Uri.parse("myscheme://share"));
                startActivity(intent);
            }
        });
    }
}

上述代碼产徊,通過uri的方式實(shí)現(xiàn)了頁面的跳轉(zhuǎn)昂勒,在AndroidManifest.xml中設(shè)置了data屬性,data代表數(shù)據(jù)源舟铜,是中最復(fù)雜的標(biāo)簽戈盈,因?yàn)椴煌腁ctivity支持的數(shù)據(jù)來源和類型多種多樣,所以需要通過詳細(xì)的data標(biāo)簽信息來指明谆刨。

Data的語法如下:

Data的語法:
<data android:host="string"
      android:mimeType="string"
      android:path="string"
      android:pathPattern="string"
      android:pathPrefix="string"
      android:port="string"
      android:scheme="string" />

Uri的格式:scheme://host:port/path or pathPrefix or pathPattern

如果scheme沒有指定塘娶,那其它的屬性均無效;

如果host沒有指定痊夭,那么port,path,pathPrefix,pathPattern均無效;

如果在manifest里這樣寫:<data android:scheme="something" android:host="project.example.com" />

那么Uri uri = Uri.parse("something://project.example.com"); 才可以匹配

再如:
<data android:scheme="something" android:host="project.example.com" android:port="80"/>
等同于這樣寫:
<data android:scheme="something"/>
<data android:host="project.example.com"/>
<data android:port="80"/>
那么Uri uri = Uri.parse("something://project.example.com:80"); 才可以匹配

可以有多個(gè)data,只需匹配其中一個(gè)即可

<activity android:name=".MyActivityTwo" android:label="@string/activityTwo">
<intent-filter>
             <action android:name="android.intent.action.leo"></action>
                <category android:name="android.intent.category.DEFAULT"></category>
                <data android:scheme="x-id"/>
                <data android:scheme="something"/>
</intent-filter>
</activity>

Intent in = new Intent();
in.setAction("android.intent.action.leo");
in.addCategory(Intent.CATEGORY_DEFAULT);            in.setData(Uri.parse("something:"));//或者用這個(gè)亦可in.setData(Uri.parse("x- id:"));           
startActivity(in);

參考資料:

1.android 再解Intent,通過配置Action和Data跳轉(zhuǎn)

2.intent-filter 之 data 「scheme, host, port, mimeType, path, pathPrefix, pathPattern」

二 . 瀏覽器啟動(dòng)APP

1.首先需要在AndroidMainifest.xml中對(duì)你要啟動(dòng)的那個(gè)activity進(jìn)行如下設(shè)置:

      <activity
            android:name=".MainActivity"
            android:launchMode="singleTask"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
            <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:scheme="myscheme://" />
            </intent-filter>
        </activity>

2.瀏覽器打開如下html頁刁岸,即可啟動(dòng)App。

<a href="myscheme://">打開app</a>

3.瀏覽器打開App時(shí)生兆,如何獲取網(wǎng)頁帶過來的數(shù)據(jù)难捌。

<a href="myscheme://?arg0=0&arg1=1">打開app</a>

(1).假如你是通過瀏覽器打開這個(gè)網(wǎng)頁的膝宁,那么獲取數(shù)據(jù)的方式為:

Uri uri = getIntent().getData();  

String test1= uri.getQueryParameter("arg0"); 
String test2= uri.getQueryParameter("arg1");

(2)如果使用webview訪問該網(wǎng)頁鸦难,獲取數(shù)據(jù)的操作為:

webView.setWebViewClient(new WebViewClient(){
  @Override
  public boolean shouldOverrideUrlLoading(WebView view, String url) {
          Uri uri=Uri.parse(url);
          if(uri.getScheme().equals("myscheme")){
              String arg0=uri.getQueryParameter("arg0");
              String arg1=uri.getQueryParameter("arg1"); 
          }else{
              view.loadUrl(url);
          }
         return true;
  }
});
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市员淫,隨后出現(xiàn)的幾起案子合蔽,更是在濱河造成了極大的恐慌,老刑警劉巖介返,帶你破解...
    沈念sama閱讀 216,843評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拴事,死亡現(xiàn)場(chǎng)離奇詭異沃斤,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)刃宵,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,538評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門衡瓶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人牲证,你說我怎么就攤上這事哮针。” “怎么了坦袍?”我有些...
    開封第一講書人閱讀 163,187評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵十厢,是天一觀的道長。 經(jīng)常有香客問我捂齐,道長蛮放,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,264評(píng)論 1 292
  • 正文 為了忘掉前任奠宜,我火速辦了婚禮包颁,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘压真。我一直安慰自己徘六,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,289評(píng)論 6 390
  • 文/花漫 我一把揭開白布榴都。 她就那樣靜靜地躺著待锈,像睡著了一般。 火紅的嫁衣襯著肌膚如雪嘴高。 梳的紋絲不亂的頭發(fā)上竿音,一...
    開封第一講書人閱讀 51,231評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音拴驮,去河邊找鬼春瞬。 笑死,一個(gè)胖子當(dāng)著我的面吹牛套啤,可吹牛的內(nèi)容都是我干的宽气。 我是一名探鬼主播,決...
    沈念sama閱讀 40,116評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼潜沦,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼萄涯!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起唆鸡,我...
    開封第一講書人閱讀 38,945評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤涝影,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后争占,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體燃逻,經(jīng)...
    沈念sama閱讀 45,367評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡序目,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,581評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了伯襟。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片猿涨。...
    茶點(diǎn)故事閱讀 39,754評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖姆怪,靈堂內(nèi)的尸體忽然破棺而出嘿辟,到底是詐尸還是另有隱情,我是刑警寧澤片效,帶...
    沈念sama閱讀 35,458評(píng)論 5 344
  • 正文 年R本政府宣布红伦,位于F島的核電站,受9級(jí)特大地震影響淀衣,放射性物質(zhì)發(fā)生泄漏昙读。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,068評(píng)論 3 327
  • 文/蒙蒙 一膨桥、第九天 我趴在偏房一處隱蔽的房頂上張望蛮浑。 院中可真熱鬧,春花似錦只嚣、人聲如沸沮稚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,692評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至贯底,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間盛杰,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,842評(píng)論 1 269
  • 我被黑心中介騙來泰國打工藐石, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留即供,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,797評(píng)論 2 369
  • 正文 我出身青樓于微,卻偏偏與公主長得像逗嫡,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子株依,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,654評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 轉(zhuǎn)載注明出處:http://www.reibang.com/p/a7535c3f33df 1. 前言 在Andro...
    王三的貓阿德閱讀 2,879評(píng)論 0 10
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,085評(píng)論 25 707
  • 轉(zhuǎn)身離開驱证,在最恰當(dāng)?shù)臅r(shí)候 交談甚歡,在最美麗的時(shí)候 相互稱贊勺三,在最愛戀的時(shí)候 激烈爭吵雷滚,在最亢奮的時(shí)候 握手言和需曾,...
    漻涸閱讀 107評(píng)論 0 3
  • 每天三件事 1吗坚、和媽媽一起做家務(wù) 2祈远、陪爸媽聊天 3、和爸媽一起看電視 小確幸商源、感悟 沒什么比陪在家人身邊更重要了...
    Katrina程閱讀 164評(píng)論 0 0
  • 文 / 藝文小舍 我看著樹上 青黃相間的葉子 我看著空中 大大小小的雨點(diǎn) 我看著 灰白涌動(dòng)的天空 我看著 靜靜流淌...
    藝文小舍閱讀 301評(píng)論 12 28