本文介绍在第三方平台下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);
}
}