Notification与应用启动

今天我们看看如何结合Uri与通知栏进入我们的应用,有关通过Uri启动APP的经典应用,应当数通过推送消息启动我们应用的指定页面或做出特定的操作了.
效果如下:

这里写图片描述

我们新建一个应用,在里面创建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>

然后新建另外一个应用,用来启动SecondActivity,主要代码如下,

    public void push(View view){
        NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
        NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
        builder.setSmallIcon(R.drawable.ic_launcher)
        .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher))
        //通知标题
        .setContentTitle("Message")
        //通知内容
                .setContentText("There is a new Message")
                //通知第一次出现时提示信息
                .setTicker("新消息")
                //无法手动移除通知
                .setOngoing(true)
                //发送通知的时间,立即发送
                .setWhen(System.currentTimeMillis())
                .setPriority(Notification.PRIORITY_DEFAULT)
                //点击通知后,自动消失
                .setAutoCancel(true);

        Uri uri = Uri.parse("good://hello.lxn.com?action=1");
        Intent intent = new Intent("android.intent.lxn");
        intent.setData(uri);
        /**
         * 第一个参数,上下文对象
         * 第二个参数,requestCode
         * 第三个参数,点击通知后的动作
         */
        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
        builder.setContentIntent(pendingIntent);
        Notification notification = builder.build();
        /**
         * 第一个参数,通知的id
         */
        manager.notify(1111, notification);
    }

当我们点击推送消息按钮的时候,发送一个通知到通知栏,然后我们点击通知进入到SecondActivity中,这里我们可以看到,是通过隐式Intent的匹配来进入Activity的。

细心的同学可能在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 之间的区别
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>

如果你只想处理某个站点的 pdf,那么在 data 标签里增加 android:host=”yoursite.com” 则只会匹配 http://yoursite.com/xxx/xxx.pdf,但这不会匹配 www.yoursite.com,如果你也想匹配这个站点的话,你就需要再添加一个 data 标签,除了 android:host 改为 “www.yoursite.com” 其他都一样。
四、特殊:如何从网页中通过Uri启动我们的应用
如果想要从网页中点击一个链接跳转到我们的应用,那除了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>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值