前言:马上快要毕业一年了,还有三个月,要在毕业一年的时候把android基础看完,把android pro4认真的过一遍,在下一年中仔细看看JAVA基础、高级应用及内核的东西。预算中最后的一年,努力吧。
上篇我们讲了Uri的结构,在这篇中,我们将看看如何利用自定义的URI来启动我的的应用。 有时,我们要通过外部Uri链接来启动我们的应用,主要是通过Uri隐式Intent匹配的方式:
Uri uri = Uri.parse("qijian://test.uri.activity?action=1"); Intent intent = new Intent("android.qijian.schemeurl.activity"); intent.setData(uri); startActivity(intent);这里通过隐式Intent匹配来启动应用,在这里我们自定义了一个Uri结构:qijian://test.uri.activity?action=1
<activity android:name=".SecondActivity" android:label="@string/title_activity_second"> <intent-filter> <action android:name="android.qijian.schemeurl.activity" /> <category android:name="android.intent.category.DEFAULT" /> <data android:scheme="qijian" android:host="test.uri.activity" /> </intent-filter> </activity>我们这里在匹配Intent时,使用指定scheme和host来精确匹配过来的Uri,以防止同名scheme就能启动我们的activity,即本来可能要启人家应用,确我们也横插一脚,用户体验很不好,一定要做到精确匹配,以防大家URI一样出现多个应用让用户选择的情况。
(1)、新建用于外部启动的Activity
首先,我们先建一个应用,命名为:SchemeURL,在这个应用中我们新建一个Activity命名为:secondActivity,其XML代码如下:
(这个Activity是为了在外部启动,为了标识这个Activity是这个应用的,把背景色改成了黄色,文字改上了“SchemeURL 的Activity”)
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#ffff00" tools:context="com.harvic.com.schemeurl.SecondActivity"> <TextView android:text="SchemeURL 的Activity" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </RelativeLayout>(2)、在AndroidManifest.xml中添加Intent-filter过滤代码:
<activity android:name=".SecondActivity" android:label="@string/title_activity_second"> <intent-filter> <action android:name="android.qijian.schemeurl.activity" /> <category android:name="android.intent.category.DEFAULT" /> <data android:scheme="qijian" android:host="test.uri.activity" /> </intent-filter> </activity>(3)新建应用:UseSchemeURL,通过自定义的Uri来从外部调起SecondActivity
代码为:
Button btn = (Button) findViewById(R.id.btn_try); btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Uri uri = Uri.parse("qijian://test.uri.activity?action=1"); Intent intent = new Intent("android.qijian.schemeurl.activity"); intent.setData(uri); startActivity(intent); } });(4)、进阶:通过Uri来传递参数,并处理
public class SecondActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); Intent intent = getIntent(); if (null != intent) { Uri uri = intent.getData(); if (uri == null) { return; } String acionData = uri.getQueryParameter("action"); TextView tv = (TextView)findViewById(R.id.qijian_test_tv); tv.append("\n传过来的action值为:" + acionData); } } }结果截图如下:
源码在文章底部给出;
有关通过Uri启动APP的经典应用,应当数通过推送消息启动我们应用的指定页面或做出特定的操作了。这部分,我们就看看如何通过推送的通知栏消息来进入我们的应用。
效果如下:
private void pushNotify() { NotificationManager notifyManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); NotificationCompat.Builder builder; builder = new NotificationCompat.Builder(this); builder.setSmallIcon(R.drawable.ic_launcher) .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher)) .setContentTitle("harvic") .setContentText("test schemeURL") .setTicker("有新消息") .setOngoing(false) .setWhen(System.currentTimeMillis()) .setPriority(Notification.PRIORITY_DEFAULT) .setAutoCancel(true); Uri uri = Uri.parse("qijian://test.uri.activity?action=1"); Intent intent = new Intent("android.qijian.schemeurl.activity"); intent.setData(uri); PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); builder.setContentIntent(pendingIntent); Notification notification = builder.build(); notifyManager.notify(1111, notification); }有关Notification的知识,我就不再讲了,最重要的是PendingIntent的封装!
Uri uri = Uri.parse("qijian://test.uri.activity?action=1"); Intent intent = new Intent("android.qijian.schemeurl.activity"); intent.setData(uri); PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);在这里大家也可以看到,这是利用隐式Intent匹配的方式来启动我们的Activity的!所有的APP在通知栏进入到自己的应用,都是通过这个方式来的!
细心的同学可能在AndroidManifest.xml中已经发现,Intent-filter的data域除了scheme、host、port这些已知的还有三个参数我们没用过——path、pathPrefix、pathPattern;它们也是用来隐式匹配Intent的,即:
<activity android:name=".SecondActivity" android:label="@string/title_activity_second"> <intent-filter> <action android:name="android.qijian.schemeurl.activity" /> <category android:name="android.intent.category.DEFAULT" /> <data android:scheme="qijian" android:host="test.uri.activity" android:path="" android:pathPrefix="" android:pathPattern=""/> </intent-filter> </activity>这里主要说的区别是 path、pathPrefix、pathPattern 之间的区别
如果我们想要匹配 http 以 “.pdf” 结尾的路径,使得别的程序想要打开网络 pdf 时,用户能够可以选择我们的程序进行下载查看。
我们可以将 scheme 设置为 “http”,pathPattern 设置为 “.*\.pdf”,整个 intent-filter 设置为:
<intent-filter> <action android:name="android.intent.action.VIEW"></action> <category android:name="android.intent.category.DEFAULT"></category> <data android:scheme="http" android:pathPattern=".*\\.pdf"></data> </intent-filter>如果你只想处理某个站点的 pdf,那么在 data 标签里增加 android:host="yoursite.com" 则只会匹配 http://yoursite.com/xxx/xxx.pdf,但这不会匹配 www.yoursite.com,如果你也想匹配这个站点的话,你就需要再添加一个 data 标签,除了 android:host 改为 “www.yoursite.com” 其他都一样。
如果想要从网页中点击一个链接跳转到我们的应用,那除了Intent-filter中的各种匹配工作,还应该加上一个属性:
<category android:name="android.intent.category.BROWSABLE"/>即,以我们的SecondActivity为例,它完整的AndroidManifest.xml的配置方式为:
<activity android:name=".SecondActivity" android:label="@string/title_activity_second"> <intent-filter> <action android:name="android.qijian.schemeurl.activity" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE"/> <data android:scheme="qijian" android:host="test.uri.activity"/> </intent-filter> </activity>
参考文章:《intent-filter 之 data 「scheme, host, port, mimeType, path, pathPrefix, pathPattern」》
1、Part1:自定义Uri与外部启动
2、PART2:特殊应用:Notification与应用启动
每个文件夹里面包含两个工程:
1、SchemeURL:这里提供第三方调用的SecondActivity
2、UseScheme:在这个APP里通过隐式匹配调用SchemeURL的SecondActivity
如果本文有帮到你,记得关注哦
源码下载地址:http://download.csdn.net/detail/harvic880925/8551159
请大家尊重原创者版权,转载请标明出处:http://blog.csdn.net/harvic880925/article/details/44781557 谢谢