Android使用NotificationManager来进行任务栏通知(使用Bmob第三方推送)

本文介绍在第三方平台下Bmob平台下的短信推送功能,大家可以下载Bmob sdk,下载地址和文档为Bmob sdk,下载地址和文档
下面主要说下在使用过程中的一些问题,大家很有可能会遇到:
主要是

在AndroidManifest.xml添加权限

<!-- 推送所需的权限 -->
   <uses-permission android:name="android.permission.RECEIVE_USER_PRESENT" />
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

添加Service

<service
            android:name="cn.bmob.push.lib.service.PushService"
            android:exported="true"
            android:label="PushService"
            android:process="cn.bmob.push">
            <intent-filter>
                <action android:name="cn.bmob.push.lib.service.PushService" />
            </intent-filter>
        </service>
   添加Receive
<receiver
            android:name="cn.bmob.push.PushReceiver"
            android:process="cn.bmob.push">
            <intent-filter>
                <!-- 优先级加最高 -->
                <!-- 系统启动完成后会调用 -->
                <action android:name="android.intent.action.BOOT_COMPLETED" />
                <!-- 解锁完成后会调用 -->
                <action android:name="android.intent.action.USER_PRESENT" />
                <!-- 监听网络连通性 -->
                <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
            </intent-filter>
        </receiver>

添加自己的推送消息接受者

<receiver android:name=".receiver.MyPushMessageReceiver">
            <intent-filter>
                <action android:name="cn.bmob.push.action.MESSAGE" />
            </intent-filter>
        </receiver>

其中MyPushMessageReceiver是一个广播接收者,代码如下:

public class MyPushMessageReceiver extends BroadcastReceiver {
    private static final String TAG = "MyPushMessageReceiver";

    @Override
    public void onReceive(Context context, Intent intent) {

        String message = intent.getStringExtra(PushConstants.EXTRA_PUSH_MESSAGE_STRING);

        /*推送的数据格式,json格式,alert为标题,articleurl为传递为要显示的网页内容
        {
            "alert": "xxxx",
            "articleurl": "http://xxx"
        }*/

        Gson gson = new Gson();
        PushInfo pushInfo = gson.fromJson(message, PushInfo.class);

        String alert = pushInfo.getAlert();
        String articleurl = pushInfo.getArticleurl();

        // 发送通知
        NotificationManager nm = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);

        Notification notification = new Notification();
        notification.icon = R.drawable.logo;
        notification.tickerText = "美文:"+alert;
        notification.defaults = Notification.DEFAULT_SOUND;

        notification.flags |= Notification.FLAG_AUTO_CANCEL;       //设置notification点击取消

        Intent intent1 = new Intent(context, ShowArticleDetailActivity.class);

        intent1.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        intent1.putExtra("articleurl",articleurl);

        //FLAG_UPDATE_CURRENT  更新当前的通知信息
        PendingIntent activity = PendingIntent.getActivity(context, 130, intent1, PendingIntent.FLAG_UPDATE_CURRENT);

        notification.setLatestEventInfo(context,"美文",alert,activity);
        nm.notify(0, notification);
    }
}

上面代码中
String message = intent.getStringExtra(PushConstants.EXTRA_PUSH_MESSAGE_STRING);
是获取发送过来额所有消息,是以json的形式返回,比如在服务器端以这样 形式返回:

{
            "alert": "xxxx",
            "articleurl": "http://xxx"
        }

这里写图片描述

需要在MyPushMessageReceiver类里解析服务器返回的json数据,这里可以需要用到json解析的知识,先介绍下json解析。
json解析主要有比较繁琐的自己一个一个字段的解析,比如从字符串解析json数据,利用Android自带 的JSONObject 进行,简单例子如下

//parseJson_net是一个工具类,根据网络获得的流,然后转化为字符串,再进行解析
public String parseJson_net(InputStream inputStream){
    String textFromStream = HttpUtils.getTextFromStream(inputStream);
    String type = "0";
    try {
        //利用JSONObject 进行解析,传入的是一个字符串
        JSONObject jsonObject = new JSONObject(textFromStream);
        //jsonObject来解析数据,先解析json数据中的节点“result”,这个是json数据的根节点
        JSONObject result = (JSONObject) jsonObject.get("result");
        //因为json数据是可以嵌套,所以返回的result 也是个json对象,再利用这个json对象往下解析
        String ctype = (String) result.get("ctype");
        String operators = (String) result.get("operators");
        String style_simcall = (String) result.get("style_simcall");
        type = ctype+":"+operators+":"+style_simcall;
    } catch (JSONException e) {
        e.printStackTrace();
    }
    return type;
}

这种方式解析数据的时比较麻烦,需要逐个解析解析字段,当然,可以用第二种方式,那就是用第三方json解析工具类,网上比较多,这里使用谷歌的Gson类来解析,json数据和类是相对应的,在解析时,一定要类中的字段和json数据中的json数据和级别一致,不让解析不到数据,具体解析方法以后再讨论下吧。

言归正传,来看看咱们的从网络返回的json数据,用谷歌的gson来解析:

定义一个PushInfo 类,这个类就是和前面的json数据想对用,alert属性对饮json中的alert字段,articleurl属性对应json中的articleurl字段,这个必须一致。

public class PushInfo {
    String alert;
    String articleurl;

    public String getAlert() {
        return alert;
    }

    public void setAlert(String alert) {
        this.alert = alert;
    }

    public String getArticleurl() {
        return articleurl;
    }

    public void setArticleurl(String articleurl) {
        this.articleurl = articleurl;
    }
}

然后用谷歌的Gson来解析

//新建gson对象
 Gson gson = new Gson();
        //调用他的fromJson(message, PushInfo.class)进行解析,message是要解析的字符串,就是前面提到的网络返回的字符串,PushInfo是json字符串对应的类。
        PushInfo pushInfo = gson.fromJson(message, PushInfo.class);
        //获取pushInfo 对象的相关属性
        String alert = pushInfo.getAlert();
        String articleurl = pushInfo.getArticleurl();

下面介绍怎么将返回的消息在任务栏上显示出来。
要在任务栏显示,要调用系统的NotificationManager来管理通知有关额信息:

        NotificationManager nm = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);

然后新建通知消息的具体通知类:

Notification notification = new Notification();
        //设置在任务栏通知的图标
        notification.icon = R.drawable.logo;
        //设置在消息发送过来的一瞬间在任务栏显示的消息,这个和后面一直在任务栏显示的消息不同
        notification.tickerText = "美文:"+alert;
        //社会默认的提醒声音
        notification.defaults = Notification.DEFAULT_SOUND;
         //设置notification点击取消
        notification.flags |= Notification.FLAG_AUTO_CANCEL;      

到这里,已经可以实现在任务栏显示消息了,接下来,讨论在点击消息时候跳到另一个Activity并在这个Activity显示对应url的web网页信息。

//新建Intent,用在Activity传递数据,点击时跳到ShowArticleDetailActivity页面
Intent intent1 = new Intent(context, ShowArticleDetailActivity.class);

//给另一个设置任务栈属性,FLAG_ACTIVITY_NEW_TASK表示新建一个任务栈来显示当前的Activity
intent1.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        intent1.putExtra("articleurl",articleurl);

        //PendingIntent 主要用于任务栏提醒和桌面weigetde 显示,
        FLAG_UPDATE_CURRENT  更新当前的通知信息
        //这里用4个参数需要注意下,130表示requestCode(请求马,自定义)
        //第三个参数书Intent对象,intent1是上面定义的 Intent对象
        //第四个对象是PendingIntent的标签属性,表叔显示方式,这里FLAG_UPDATE_CURRENT表示显示当前的通知,如果用新的通知时,更新当期的通知,这个属性注意下,如果不设置的话每次点击都是同一个通知
        PendingIntent activity = PendingIntent.getActivity(context, 130, intent1, PendingIntent.FLAG_UPDATE_CURRENT);

在接下来让通知显示:

//第二个参数是要显示的通知的标题
//第三个参数是要显示的通知的内容,
//第四个参数表示点击后要启动的Activity
notification.setLatestEventInfo(context,"美文",alert,activity);

还差最后一步,显示通知:

//调用通知管理器来进行通知
nm.notify(0, notification);

然后可以在中显示对应url的web消息,ShowArticleDetailActivity 如下,这个Activity比较简单,就是用WebVIew来显示消息,只需要一个url即可,

public class ShowArticleDetailActivity extends Activity {

    private static final String TAG = "ShowArticleActivity";
    private WebView wv_showarticle_artical;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_show_article_detail);

        wv_showarticle_artical = (WebView) findViewById(R.id.wv_showarticle_artical);

        showAtricel();
    }

    public void showAtricel(){

        Intent intent = getIntent();
        //获取传过来的articleurl
        String articleurl = intent.getStringExtra("articleurl");
        //显示
        wv_showarticle_artical.loadUrl(articleurl);
    }
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值