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;
}
});