因为最近项目需求用到过推送,所以研究了下基于Bmob服务的推送,下面贴出代码。下面代码主要功能在于 发布信息后,所有的安卓设备可以收到信息
原创文章,欢迎转载。转载请注明:一叶知秋的博客
地址:http://blog.csdn.net/lcm0811/article/details/46126225
权限添加,权限没有经过整理,省事全部贴过来了。
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.READ_LOGS" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.RECEIVE_USER_PRESENT" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<!-- BmobPush SDK权限 -->
<permission
android:name="cn.bmob.permission.push"
android:protectionLevel="normal" >
</permission>
<uses-permission android:name="cn.bmob.permission.push" /> <!-- 添加自定义的权限 -->
<service
android:name="cn.bmob.push.lib.service.PushService"
android:exported="true"
android:label="PushService"
android:permission="cn.bmob.permission.push"
android:process="cn.bmob.push" >
<intent-filter>
<action android:name="cn.bmob.push.lib.service.PushService" />
</intent-filter>
</service>
<receiver android:name="cn.bmob.push.PushReceiver" >
<intent-filter android:priority="2147483647" > <!-- 优先级加最高 -->
<!-- 系统启动完成后会调用 -->
<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="com.shundu.wait4u.activity.MyPushMessageReceiver" >
<intent-filter>
<action android:name="cn.bmob.push.action.MESSAGE" />
</intent-filter>
</receiver>
下面贴出来的是 点击发送后,开始执行推送,使用JSON数据推送,其中android.intent.action.Tz\没有作用,我们用开关做了验证,关上开关就接受不到推送的功能,Installation中定义了一个字段pushState来接收开关的值。
@SuppressWarnings("unchecked")
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.info_ok:
send();
String pushJsonStr = "{\"alert\":\"你有新的消息了\",\"title\":\"新信息\",\"message\":\"金钱在向你招手!抓紧吧!先到先得\",\"website\":\"android.intent.action.Tz\"}";
JSONObject jsonObject = null;
try {
jsonObject = new JSONObject(pushJsonStr);
} catch (JSONException e) {
e.printStackTrace();
}
toastShort("进行推送");
// 使用推送服务时的初始化操作
Bmob.initialize(getActivity(), BmobConstant.APPID);
MyInstallation.getCurrentInstallation(getActivity()).save();
// 启动推送服务
BmobPush.startWork(getActivity(), BmobConstant.APPID);
// 创建推送消息的对象
BaseActivity.bmobPushManager = new BmobPushManager(getActivity());
// 创建Installation表的BmobQuery对象
BmobQuery<In// 创建Installation表的BmobQuery对象stallation> query = BmobInstallation.getQuery();
query.addWhereEqualTo("pushState", true);
// 并添加条件为设备类型属于android
query.addWhereEqualTo("deviceType", "android");
query.addWhereNotEqualTo("installationId", BmobInstallation.getInstallationId(getActivity()));
// 设置推送条件给bmobPushManager对象。
BaseActivity.bmobPushManager.setQuery(query);
// 设置推送消息,服务端会根据上面的查询条件,来进行推送这条消息
BaseActivity.bmobPushManager.pushMessage(jsonObject);
break;
下面贴出MyPushMessageReceiver类,此类管理接收来的JSON数据,并定义推送通知的方法
import java.util.HashMap;
import java.util.Map;
import org.json.JSONObject;
import com.shundu.wait4u.fragment.OrderFragment;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import cn.bmob.push.PushConstants;
public class MyPushMessageReceiver extends BroadcastReceiver {
public static final int ID = 1001;
private NotificationManager mNotification;
private Notification notification;
private Map<String, String> myMap;
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals("cn.bmob.push.action.MESSAGE")) {
myMap = parseJson(intent.getStringExtra(PushConstants.EXTRA_PUSH_MESSAGE_STRING));
String alert = myMap.get("alert");
String title = myMap.get("title");
String message = myMap.get("message");
String website = myMap.get("website");
mNotification = (NotificationManager) context.getSystemService(context.NOTIFICATION_SERVICE);
notification = new Notification();
notification.icon = R.drawable.icon;
notification.tickerText = alert;
notification.when = System.currentTimeMillis();
notification.flags = Notification.FLAG_AUTO_CANCEL;
Intent i = new Intent(context, MainActivity.class);
i.putExtra("website", website);
PendingIntent pIntent = PendingIntent.getActivity(context, 0, i, PendingIntent.FLAG_UPDATE_CURRENT);
notification.setLatestEventInfo(context, title, message, pIntent);
mNotification.notify(ID, notification);
}
}
/**
* 解析推送过来的json数据
*
* @param json
* @return
*/
private Map<String, String> parseJson(String json) {
Map<String, String> map = new HashMap<String, String>();
try {
JSONObject jsonObject = new JSONObject(json);
map.put("alert", jsonObject.getString("alert"));
map.put("title", jsonObject.getString("title"));
map.put("message", jsonObject.getString("message"));
map.put("website", jsonObject.getString("website"));
} catch (Exception e) {
throw new RuntimeException(e);
}
return map;
}
}
以上就是基本的核心代码,有问题或者发现问题的欢迎大家一起探讨,交流。