先给大家看一下Uri的三种结构,这三种结构只是划分不同而已;
[scheme:]scheme-specific-part[#fragment]
[scheme:][//authority][path][?query][#fragment]
[scheme:][//host:port][path][?query][#fragment]
今天我们来看看怎样根据Uri从外部启动应用,
先新建一个应用SchemaUri,在里面我们新建SecondActivity,配置如下:
<activity
android:name=".SecondActivity"
>
<intent-filter>
<action android:name="android.intent.lxn" />
<category android:name="android.intent.category.DEFAULT" />
<data
android:scheme="good"
android:host="hello.lxn.com"
/>
</intent-filter>
</activity>
我们指定了action,schema和host,那么我们如何来从外部启动这个activity呢?
我们再建一个项目UseSchema,当点击按钮的时候调起外部的SecondActivity,
代码如下:
public void start(View view){
Uri uri = Uri.parse("good://hello.lxn.com?action=1");
Intent intent = new Intent("android.intent.lxn");
intent.setData(uri);
startActivity(intent);
}
可以看到,我们是通过Uri来隐式启动外部的SecondActivity的,这个Uri的schema为good,path为//hello.lxn.com,query为action=1,并且我们指定了动作,所以能够匹配SecondActivity并且启动。那么我们如何在SecondActivity中获取到Uri中的参数呢?
我们为SecondActivity的布局文件中添加一个TextView:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/secondtextview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="schemauri"
/>
</LinearLayout>
然后在SecondActivity中获取Uri传过来的值:
public class SecondActivity extends Activity{
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
textView = (TextView) findViewById(R.id.secondtextview);
Intent intent = getIntent();
if(intent == null){
return;
}
Uri uri = intent.getData();
String value = uri.getQueryParameter("action");
textView.setText("query value :"+value);
}
}
可以看到我们已经获取到了Uri中query的值。