Uri详解之二——通过自定义Uri外部启动APP与Notification启动
来源:互联网 发布:华为喵王软件 编辑:程序博客网 时间:2024/05/05 16:33
一、自定义Uri与外部启动
1、概述
上篇我们讲了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时,使用的语法为:
- <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>
这样,第三方就能通过这个Uri来匿名启动我们的Activity了。
2、实例
(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>
在SecondAcitivity中添加上Intent-filter用于隐式启动Intent,由于我们定义的Uri格式为:qijian://test.uri.activity?action=1,所以我们固定schemeurl和host,通过query来传递参数即可;
除了Uri匹配,我这里还添加上了Action:“android.qijian.schemeurl.activity”,所以我们在第三方隐式匹配时要同时通过Uri和action来同时匹配才能通过这里的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>
这个应用的外观是这个样子的:当点击按钮时,调起SchemeURL的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);
- }
- });
在上面,我们已经能够通过Uri来进入我们的应用,我们上面只是固定了Uri的scheme部分和host部分,对于其它部分并没有固定,所以我们可以通过其它部分来传递参数,进而完成指定的功能:比较进入指定的页面或做出指定的操作,等
比如,我们在SchemeURL中,对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);
- }
- }
- }
源码在文章底部给出;
二、特殊应用:Notification与应用启动
有关通过Uri启动APP的经典应用,应当数通过推送消息启动我们应用的指定页面或做出特定的操作了。这部分,我们就看看如何通过推送的通知栏消息来进入我们的应用。
效果如下:
- 首先:SchemeURL工程代码都不变,我们依然通过隐式匹配Intent来启动SecondActivity.
- 然后:在UseSchemeURL工程中新加一个按钮,当点击时,发送Notification通知,点击跳转到SchemeURL工程的SecondActivity
- 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);
- }
即如下代码:
- 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);
三、有关path、pathPrefix、pathPattern 之间的区别
细心的同学可能在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: 用来匹配完整的路径,如:http://example.com/blog/abc.html,这里将 path 设置为 /blog/abc.html 才能够进行匹配;
- pathPrefix: 用来匹配路径的开头部分,拿上面的 Uri 来说,这里将 pathPrefix 设置为 /blog 就能进行匹配了;
- pathPattern: 用表达式来匹配整个路径,这里需要说下匹配符号与转义。
1、“” 用来匹配0次或更多,如:“a” 可以匹配“a”、“aa”、“aaa”…
2、“.” 用来匹配任意字符,如:“.” 可以匹配“a”、“b”,“c”…
3、因此 “.*” 就是用来匹配任意字符0次或更多,如:“.*html” 可以匹配 “abchtml”、“chtml”,“html”,“sdf.html”…
转义:
因为当读取 Xml 的时候,“\” 是被当作转义字符的(当它被用作 pathPattern 转义之前),因此这里需要两次转义,读取 Xml 是一次,在 pathPattern 中使用又是一次。如:“” 这个字符就应该写成 “\”,“\” 这个字符就应该写成 “\\”。
样例:匹配 http 以 “.pdf” 结尾的路径
如果我们想要匹配 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>
四、特殊:如何从网页中通过Uri启动我们的应用
如果想要从网页中点击一个链接跳转到我们的应用,那除了Intent-filter中的各种匹配工作,还应该加上一个属性:
- <category android:name="android.intent.category.BROWSABLE"/>
- <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 谢谢
- Uri详解之二——通过自定义Uri外部启动APP与Notification启动
- Uri详解之二——通过自定义Uri外部启动APP与Notification启动
- Uri详解之二——通过自定义Uri外部启动APP与Notification启动
- Uri详解之二——通过自定义Uri外部启动APP与Notification启动
- Uri详解之二——通过自定义Uri外部启动APP与Notification启动
- Android Uri外部启动app或者notification启动
- 自定义Uri启动外部应用
- Uri详解之——Uri结构与代码提取
- Uri详解之——Uri结构与代码提取
- Uri详解之——Uri结构与代码提取
- Uri详解之——Uri结构与代码提取
- Uri详解之——Uri结构与代码提取
- Uri详解之——Uri结构与代码提取
- Uri详解之——Uri结构与代码提取
- Uri详解之——Uri结构与代码提取
- Uri详解之——Uri结构与代码提取
- Uri详解之——Uri结构与代码提取
- Uri详解之——Uri结构与代码提取
- 社説 20150818 GDPマイナス 景気の停滞を長引かせるな
- Charles抓Https
- Maven 使用指南(3): 简述Maven工作过程
- singleInstance启动模式
- oracle体系结构详解
- Uri详解之二——通过自定义Uri外部启动APP与Notification启动
- Oracle 11g 空表解决方案
- Emoji表情符号录入MySQL数据库报错的解决方案
- 慕课网学习-- PHP+MySQL分页原理实现
- 你是你坚强的后盾
- Maven 使用指南(4): Maven Build 的阶段
- 关于Android隐式启动Activity
- OSI七层模型
- 去哪网实习总结:递归构建“流程执行顺序”的XML文件(JavaWeb)