編輯:關於Android編程
首先在權限中加入以下權限(API_KEY必須改,log日志可能打印不出來,只要到達數為1,等會就好了)
在Application中
public class Application extends android.app.Application {
@Override
public void onCreate() {
super.onCreate();
initPush();
}
private void initPush() {
Resources resource = this.getResources();
String pkgName = this.getPackageName();
PushManager.startWork(getApplicationContext(),
PushConstants.LOGIN_TYPE_API_KEY,
Utils.getMetaValue(this, "api_key"));
// Push: 如果想基於地理位置推送,可以打開支持地理位置的推送的開關
// PushManager.enableLbs(getApplicationContext());
// Push: 設置自定義的通知樣式,具體API介紹見用戶手冊,如果想使用系統默認的可以不加這段代碼
// 請在通知推送界面中,高級設置->通知欄樣式->自定義樣式,選中並且填寫值:1,
// 與下方代碼中 PushManager.setNotificationBuilder(this, 1, cBuilder)中的第二個參數對應
CustomPushNotificationBuilder cBuilder = new CustomPushNotificationBuilder(
resource.getIdentifier("notification_custom_builder", "layout",
pkgName), resource.getIdentifier("notification_icon",
"id", pkgName), resource.getIdentifier(
"notification_title", "id", pkgName),
resource.getIdentifier("notification_text", "id", pkgName));
cBuilder.setNotificationFlags(Notification.FLAG_AUTO_CANCEL);
cBuilder.setNotificationDefaults(Notification.DEFAULT_VIBRATE);
cBuilder.setStatusbarIcon(this.getApplicationInfo().icon);
cBuilder.setLayoutDrawable(resource.getIdentifier(
"simple_notification_icon", "drawable", pkgName));
cBuilder.setNotificationSound(Uri.withAppendedPath(
Audio.Media.INTERNAL_CONTENT_URI, "6").toString());
// 推送高級設置,通知欄樣式設置為下面的ID
PushManager.setNotificationBuilder(this, 1, cBuilder);
}
package com.example.ykdemo;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import org.json.JSONException;
import org.json.JSONObject;
import com.baidu.android.pushservice.PushMessageReceiver;
import android.content.Context;
import android.content.Intent;
import android.text.TextUtils;
import android.util.Log;
/*
* Push娑堟伅澶勭悊receiver銆傝缂栧啓鎮ㄩ渶瑕佺殑鍥炶皟鍑芥暟锛?涓?埇鏉ヨ锛?onBind鏄繀椤葷殑锛岀敤鏉ュ鐞唖tartWork杩斿洖鍊硷紱
*onMessage鐢ㄦ潵鎺ユ敹閫忎紶娑堟伅锛?onSetTags銆乷nDelTags銆乷nListTags鏄痶ag鐩稿叧鎿嶄綔鐨勫洖璋冿紱
*onNotificationClicked鍦ㄩ?鐭ヨ鐐瑰嚮鏃跺洖璋冿紱 onUnbind鏄痵topWork鎺ュ彛鐨勮繑鍥炲?鍥炶皟
* 杩斿洖鍊間腑鐨別rrorCode锛岃В閲婂涓嬶細
*0 - Success
*10001 - Network Problem
*10101 Integrate Check Error
*30600 - Internal Server Error
*30601 - Method Not Allowed
*30602 - Request Params Not Valid
*30603 - Authentication Failed
*30604 - Quota Use Up Payment Required
*30605 -Data Required Not Found
*30606 - Request Time Expires Timeout
*30607 - Channel Token Timeout
*30608 - Bind Relation Not Found
*30609 - Bind Number Too Many
* 褰撴偍閬囧埌浠ヤ笂杩斿洖閿欒鏃訛紝濡傛灉瑙i噴涓嶄簡鎮ㄧ殑闂锛岃鐢ㄥ悓涓?姹傜殑杩斿洖鍊紃equestId鍜宔rrorCode鑱旂郴鎴戜滑杩芥煡闂銆? *
*/
public class MyPushMessageReceiver extends PushMessageReceiver {
/** TAG to Log */
public static final String TAG = MyPushMessageReceiver.class
.getSimpleName();
/**
* 璋冪敤PushManager.startWork鍚庯紝sdk灏嗗push
* server鍙戣搗缁戝畾璇鋒眰锛岃繖涓繃绋嬫槸寮傛鐨勩?缁戝畾璇鋒眰鐨勭粨鏋滈?杩噊nBind杩斿洖銆?濡傛灉鎮ㄩ渶瑕佺敤鍗曟挱鎺ㄩ?锛岄渶瑕佹妸杩欓噷鑾峰彇鐨刢hannel
* id鍜寀ser id涓婁紶鍒板簲鐢╯erver涓紝鍐嶈皟鐢╯erver鎺ュ彛鐢╟hannel id鍜寀ser id缁欏崟涓墜鏈烘垨鑰呯敤鎴鋒帹閫併?
*
* @param context
* BroadcastReceiver鐨勬墽琛孋ontext
* @param errorCode
* 缁戝畾鎺ュ彛杩斿洖鍊硷紝0 - 鎴愬姛
* @param appid
* 搴旂敤id銆俥rrorCode闈?鏃朵負null
* @param userId
* 搴旂敤user id銆俥rrorCode闈?鏃朵負null
* @param channelId
* 搴旂敤channel id銆俥rrorCode闈?鏃朵負null
* @param requestId
* 鍚戞湇鍔$鍙戣搗鐨勮姹俰d銆傚湪杩芥煡闂鏃舵湁鐢紱
* @return none
*/
@Override
public void onBind(Context context, int errorCode, String appid,
String userId, String channelId, String requestId) {
String responseString = "onBind errorCode=" + errorCode + " appid="
+ appid + " userId=" + userId + " channelId=" + channelId
+ " requestId=" + requestId;
Log.d(TAG, responseString);
if (errorCode == 0) {
// 缁戝畾鎴愬姛
Log.d(TAG, "缁戝畾鎴愬姛");
}
// Demo鏇存柊鐣岄潰灞曠ず浠g爜锛屽簲鐢ㄨ鍦ㄨ繖閲屽姞鍏ヨ嚜宸辯殑澶勭悊閫昏緫
updateContent(context, responseString);
}
/**
* 鎺ユ敹閫忎紶娑堟伅鐨勫嚱鏁般?
*
* @param context
* 涓婁笅鏂? * @param message
* 鎺ㄩ?鐨勬秷鎭? * @param customContentString
* 鑷畾涔夊唴瀹?涓虹┖鎴栬?json瀛楃涓? */
@Override
public void onMessage(Context context, String message,
String customContentString) {
String messageString = "閫忎紶娑堟伅 onMessage=\"" + message
+ "\" customContentString=" + customContentString;
Log.d(TAG, messageString);
// 鑷畾涔夊唴瀹硅幏鍙栨柟寮忥紝mykey鍜宮yvalue瀵瑰簲閫忎紶娑堟伅鎺ㄩ?鏃惰嚜瀹氫箟鍐呭涓缃殑閿拰鍊? if (!TextUtils.isEmpty(customContentString)) {
JSONObject customJson = null;
try {
customJson = new JSONObject(customContentString);
String myvalue = null;
if (!customJson.isNull("mykey")) {
myvalue = customJson.getString("mykey");
}
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// Demo鏇存柊鐣岄潰灞曠ず浠g爜锛屽簲鐢ㄨ鍦ㄨ繖閲屽姞鍏ヨ嚜宸辯殑澶勭悊閫昏緫
// updateContent(context, messageString);
// }
/**
* 鎺ユ敹閫氱煡鍒拌揪鐨勫嚱鏁般?
*
* @param context
* 涓婁笅鏂? * @param title
* 鎺ㄩ?鐨勯?鐭ョ殑鏍囬
* @param description
* 鎺ㄩ?鐨勯?鐭ョ殑鎻忚堪
* @param customContentString
* 鑷畾涔夊唴瀹癸紝涓虹┖鎴栬?json瀛楃涓? */
@Override
public void onNotificationArrived(Context context, String title,
String description, String customContentString) {
String notifyString = "閫氱煡鍒拌揪 onNotificationArrived title=\"" + title
+ "\" description=\"" + description + "\" customContent="
+ customContentString;
Log.d(TAG, notifyString);
// 鑷畾涔夊唴瀹硅幏鍙栨柟寮忥紝mykey鍜宮yvalue瀵瑰簲閫氱煡鎺ㄩ?鏃惰嚜瀹氫箟鍐呭涓缃殑閿拰鍊? if (!TextUtils.isEmpty(customContentString)) {
JSONObject customJson = null;
try {
customJson = new JSONObject(customContentString);
String myvalue = null;
if (!customJson.isNull("mykey")) {
myvalue = customJson.getString("mykey");
}
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// Demo鏇存柊鐣岄潰灞曠ず浠g爜锛屽簲鐢ㄨ鍦ㄨ繖閲屽姞鍏ヨ嚜宸辯殑澶勭悊閫昏緫
// 浣犲彲浠ュ弮鑰?onNotificationClicked涓殑鎻愮ず浠庤嚜瀹氫箟鍐呭鑾峰彇鍏蜂綋鍊? updateContent(context, notifyString);
// }
/**
* 鎺ユ敹閫氱煡鐐瑰嚮鐨勫嚱鏁般?
*
* @param context
* 涓婁笅鏂? * @param title
* 鎺ㄩ?鐨勯?鐭ョ殑鏍囬
* @param description
* 鎺ㄩ?鐨勯?鐭ョ殑鎻忚堪
* @param customContentString
* 鑷畾涔夊唴瀹癸紝涓虹┖鎴栬?json瀛楃涓? */
@Override
public void onNotificationClicked(Context context, String title,
String description, String customContentString) {
String notifyString = "閫氱煡鐐瑰嚮 onNotificationClicked title=\"" + title + "\" description=\""
+ description + "\" customContent=" + customContentString;
Log.d(TAG, notifyString);
// 鑷畾涔夊唴瀹硅幏鍙栨柟寮忥紝mykey鍜宮yvalue瀵瑰簲閫氱煡鎺ㄩ?鏃惰嚜瀹氫箟鍐呭涓缃殑閿拰鍊? if (!TextUtils.isEmpty(customContentString)) {
JSONObject customJson = null;
try {
customJson = new JSONObject(customContentString);
String myvalue = null;
if (!customJson.isNull("mykey")) {
myvalue = customJson.getString("mykey");
}
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// Demo鏇存柊鐣岄潰灞曠ず浠g爜锛屽簲鐢ㄨ鍦ㄨ繖閲屽姞鍏ヨ嚜宸辯殑澶勭悊閫昏緫
// updateContent(context, notifyString);
// }
/**
* setTags() 鐨勫洖璋冨嚱鏁般?
*
* @param context
* 涓婁笅鏂? * @param errorCode
* 閿欒鐮併?0琛ㄧず鏌愪簺tag宸茬粡璁劇疆鎴愬姛锛涢潪0琛ㄧず鎵?湁tag鐨勮缃潎澶辮觸銆? * @param successTags
* 璁劇疆鎴愬姛鐨則ag
* @param failTags
* 璁劇疆澶辮觸鐨則ag
* @param requestId
* 鍒嗛厤缁欏浜戞帹閫佺殑璇鋒眰鐨刬d
*/
@Override
public void onSetTags(Context context, int errorCode,
List sucessTags, List failTags, String requestId) {
String responseString = "onSetTags errorCode=" + errorCode
+ " sucessTags=" + sucessTags + " failTags=" + failTags
+ " requestId=" + requestId;
Log.d(TAG, responseString);
// Demo鏇存柊鐣岄潰灞曠ず浠g爜锛屽簲鐢ㄨ鍦ㄨ繖閲屽姞鍏ヨ嚜宸辯殑澶勭悊閫昏緫
updateContent(context, responseString);
}
/**
* delTags() 鐨勫洖璋冨嚱鏁般?
*
* @param context
* 涓婁笅鏂? * @param errorCode
* 閿欒鐮併?0琛ㄧず鏌愪簺tag宸茬粡鍒犻櫎鎴愬姛锛涢潪0琛ㄧず鎵?湁tag鍧囧垹闄ゅけ璐ャ?
* @param successTags
* 鎴愬姛鍒犻櫎鐨則ag
* @param failTags
* 鍒犻櫎澶辮觸鐨則ag
* @param requestId
* 鍒嗛厤缁欏浜戞帹閫佺殑璇鋒眰鐨刬d
*/
@Override
public void onDelTags(Context context, int errorCode,
List sucessTags, List failTags, String requestId) {
String responseString = "onDelTags errorCode=" + errorCode
+ " sucessTags=" + sucessTags + " failTags=" + failTags
+ " requestId=" + requestId;
Log.d(TAG, responseString);
// Demo鏇存柊鐣岄潰灞曠ず浠g爜锛屽簲鐢ㄨ鍦ㄨ繖閲屽姞鍏ヨ嚜宸辯殑澶勭悊閫昏緫
updateContent(context, responseString);
}
/**
* listTags() 鐨勫洖璋冨嚱鏁般?
*
* @param context
* 涓婁笅鏂? * @param errorCode
* 閿欒鐮併?0琛ㄧず鍒椾婦tag鎴愬姛锛涢潪0琛ㄧず澶辮觸銆? * @param tags
* 褰撳墠搴旂敤璁劇疆鐨勬墍鏈塼ag銆? * @param requestId
* 鍒嗛厤缁欏浜戞帹閫佺殑璇鋒眰鐨刬d
*/
@Override
public void onListTags(Context context, int errorCode, List tags,
String requestId) {
String responseString = "onListTags errorCode=" + errorCode + " tags="
+ tags;
Log.d(TAG, responseString);
// Demo鏇存柊鐣岄潰灞曠ず浠g爜锛屽簲鐢ㄨ鍦ㄨ繖閲屽姞鍏ヨ嚜宸辯殑澶勭悊閫昏緫
updateContent(context, responseString);
}
/**
* PushManager.stopWork() 鐨勫洖璋冨嚱鏁般?
*
* @param context
* 涓婁笅鏂? * @param errorCode
* 閿欒鐮併?0琛ㄧず浠庝簯鎺ㄩ?瑙g粦瀹氭垚鍔燂紱闈?琛ㄧず澶辮觸銆? * @param requestId
* 鍒嗛厤缁欏浜戞帹閫佺殑璇鋒眰鐨刬d
*/
@Override
public void onUnbind(Context context, int errorCode, String requestId) {
String responseString = "onUnbind errorCode=" + errorCode
+ " requestId = " + requestId;
Log.d(TAG, responseString);
if (errorCode == 0) {
// 瑙g粦瀹氭垚鍔? Log.d(TAG, "瑙g粦鎴愬姛");
}
// Demo鏇存柊鐣岄潰灞曠ず浠g爜锛屽簲鐢ㄨ鍦ㄨ繖閲屽姞鍏ヨ嚜宸辯殑澶勭悊閫昏緫
updateContent(context, responseString);
}
private void updateContent(Context context, String content) {
Log.d(TAG, "updateContent");
String logText = "" + Utils.logStringCache;
if (!logText.equals("")) {
logText += "\n";
}
SimpleDateFormat sDateFormat = new SimpleDateFormat("HH-mm-ss");
logText += sDateFormat.format(new Date()) + ": ";
logText += content;
Utils.logStringCache = logText;
Intent intent = new Intent();
intent.setClass(context.getApplicationContext(), MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.getApplicationContext().startActivity(intent);
}
}
Utils中
package com.example.ykdemo;
import java.util.ArrayList;
import java.util.List;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.util.Log;
public class Utils {
public static final String TAG = "PushDemoActivity";
public static final String RESPONSE_METHOD = "method";
public static final String RESPONSE_CONTENT = "content";
public static final String RESPONSE_ERRCODE = "errcode";
protected static final String ACTION_LOGIN = "com.baidu.pushdemo.action.LOGIN";
public static final String ACTION_MESSAGE = "com.baiud.pushdemo.action.MESSAGE";
public static final String ACTION_RESPONSE = "bccsclient.action.RESPONSE";
public static final String ACTION_SHOW_MESSAGE = "bccsclient.action.SHOW_MESSAGE";
protected static final String EXTRA_ACCESS_TOKEN = "access_token";
public static final String EXTRA_MESSAGE = "message";
public static String logStringCache = "";
// 鑾峰彇ApiKey
public static String getMetaValue(Context context, String metaKey) {
Bundle metaData = null;
String apiKey = null;
if (context == null || metaKey == null) {
return null;
}
try {
ApplicationInfo ai = context.getPackageManager()
.getApplicationInfo(context.getPackageName(),
PackageManager.GET_META_DATA);
if (null != ai) {
metaData = ai.metaData;
}
if (null != metaData) {
apiKey = metaData.getString(metaKey);
}
} catch (NameNotFoundException e) {
Log.e(TAG, "error " + e.getMessage());
}
return apiKey;
}
public static List getTagsList(String originalText) {
if (originalText == null || originalText.equals("")) {
return null;
}
List tags = new ArrayList();
int indexOfComma = originalText.indexOf(',');
String tag;
while (indexOfComma != -1) {
tag = originalText.substring(0, indexOfComma);
tags.add(tag);
originalText = originalText.substring(indexOfComma + 1);
indexOfComma = originalText.indexOf(',');
}
tags.add(originalText);
return tags;
}
public static String getLogText(Context context) {
SharedPreferences sp = PreferenceManager
.getDefaultSharedPreferences(context);
return sp.getString("log_text", "");
}
public static void setLogText(Context context, String text) {
SharedPreferences sp = PreferenceManager
.getDefaultSharedPreferences(context);
Editor editor = sp.edit();
editor.putString("log_text", text);
editor.commit();
}
}
Android插件化(一):使用改進的MultiDex動態加載assets中的apk
為了解決65535方法數超標的問題,Google推薦使用MultiDex來加載classes2.dex,classes3.dex等等,其基本思想就是在運行時動態修改Cla
android 如何調用WPS顯示工作文件
以下是指定使用WPS中文版打開文檔的代碼示例(WPS不同語言版的包名略有不同,請注意紅色標記部分哦): <打開文件>&nbs
RX操作符之過濾操作
一、debounce僅在過了一段指定的時間還沒發射數據時才發射一個數據,Debounce操作符會過濾掉發射速率過快的數據項。注:這個操作符會會接著最後一項數據發射原始Ob
Android listview多視圖嵌套多視圖
首先給大家展示下效果圖:public class HomeEduMoreAdapter extends BaseAdapter {private final String