編輯:關於Android編程
點擊“Create project”按鍵後,將引導你創建第一個項目。如果之前有創建項目,將不會看到這個提示,你看到的會是一個面板。點擊左上角的下拉菜單,選擇“Other projects”-"Create",將會引導你創建一個項目,你的浏覽器地址將會形如:https://code.google.com/apis/console/#project:812216982441。注意#project:後面的數字812216982441,這將會在後面的GCM服務中作為標識號,用於客戶端向谷歌服務器注冊。以上是准備工作的第一步。
第二:激活你的GCM服務。
在谷歌Api控制台頁面中,選中“Services”項,打開“Google Cloud Messaging for Android”項中的開關並接受協議,激活你賬號下的GCM服務。
第三:獲得API Key
還是在控制台頁面,選中“API Access”。點擊“Create New Server Key”,在接下來的界面中直接點“Create”,將會生成一個Api Key,這個Api Key將用來驗證發送方。
第四,你的電腦需要具有GCM服務所必須的一些包。這些包可以在Android SDK Manager中下載安裝,更新的包名叫Google Cloud Messaging for Android,在Extras展開項中。安裝完後,在sdk所在目錄\extras\google\gcm中,在這裡你會看到gcm的發送、接收等操作使用到的工具類和包都有在這裡面。
你可以用eclipse直接import這些項目,並導入裡面的幾個包,基於這些類文件,我們創建對它們的調用。以上,准備工作已經完畢。下面我們開始講講怎麼使用。(注:准備工作中,如果安卓設備沒有Google Play Services包,還需要另外增加第5步,自己去下載谷歌play的服務包並安裝到手機/平板中)
需要注意的是,GMC的方式並沒有嚴格的客戶端和服務端的,只要求接收消息的是安卓應用,而發送消息的一方可以是任意程序。可以在你自己搭建的服務器裡,可以是同一個安卓應用裡,也可以只是一個main函數。不過需要使用到的類和環境就要分別搭建好了。
使用GCMRegistrar和Sender這兩個類可以分別實現客戶端的注冊和發送消息的功能。這兩個類就在我們剛才下載的gcm服務包中。(在谷歌play服務包google-play-services.jar包中,有一個GoogleCloudMessaging的類,也可以提供注冊客戶端和發送消息的方法。不過看了官方文檔,和前一種方式差不多。這裡先不講這種方法了。)
以上完成了開始的准備工作。接下來講代碼的實現:
先講客戶端注冊服務。首先要在AndroidManifest.xml文件裡面添加3個GCM/C2DM的權限和必要的網絡訪問等權限。完整的文件在後面給出。
然後創建一個名為GCMIntentService的android服務,並且繼承GCMBaseIntentService這個抽象類並實現裡面的幾個方法,記得在配置文件裡面要申明service。尤其要注意的是,這個service一定要命名為GCMIntentService,並且放到應用包名下。因為GCM的機制會默認使用到這個服務,並且沒有提供可以設置為其它服務代替它的方法。
GCMIntentService類:
[java]
public class GCMIntentService extends GCMBaseIntentService {
public static final String SENDERID = "812216982441";
public GCMIntentService(){
super(SENDERID);
}
@Override
protected void onError(Context arg0, String arg1) {
Log.v("GCMIntentService", "onError錯誤");
}
@Override
protected void onMessage(Context arg0, Intent arg1) {
Log.v("GCMIntentService", "收到新消息:"+arg1.getStringExtra("mine"));
final String info = arg1.getStringExtra("mine");
Handler handler = new Handler(Looper.getMainLooper());
handler.post(new Runnable() {
@Override
public void run() {
Toast.makeText(getBaseContext(), "收到新消息:"+info, Toast.LENGTH_LONG).show();
}
});
}
@Override
protected void onRegistered(Context arg0, String arg1) {
Log.v("GCMIntentService", "onRegistered注冊完成");
}
@Override
protected void onUnregistered(Context arg0, String arg1) {
Log.v("GCMIntentService", "onUnregistered注銷注冊");
}
}
public class GCMIntentService extends GCMBaseIntentService {
public static final String SENDERID = "812216982441";
public GCMIntentService(){
super(SENDERID);
}
@Override
protected void onError(Context arg0, String arg1) {
Log.v("GCMIntentService", "onError錯誤");
}
@Override
protected void onMessage(Context arg0, Intent arg1) {
Log.v("GCMIntentService", "收到新消息:"+arg1.getStringExtra("mine"));
final String info = arg1.getStringExtra("mine");
Handler handler = new Handler(Looper.getMainLooper());
handler.post(new Runnable() {
@Override
public void run() {
Toast.makeText(getBaseContext(), "收到新消息:"+info, Toast.LENGTH_LONG).show();
}
});
}
@Override
protected void onRegistered(Context arg0, String arg1) {
Log.v("GCMIntentService", "onRegistered注冊完成");
}
@Override
protected void onUnregistered(Context arg0, String arg1) {
Log.v("GCMIntentService", "onUnregistered注銷注冊");
}
}
這幾個方法是結合了GCM的機制的,注意不要誤解成了它們是安卓的service的。
onError:在注冊客戶端或者解除注冊出錯時調用。
onMessage:客戶端收到消息時調用。
onRegistered:注冊完成。
onUnregistered:解除注冊完成。
“常量”SENDERID是前面在控制台頁面創建項目時得到的那個值。
建好服務類後就可以開始注冊了。以下是注冊的代碼片段,直接在Activit的onCreate方法裡執行就可以。
[java] view plaincopyprint?protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
GCMRegistrar.checkDevice(this);
GCMRegistrar.checkManifest(this);
final String regId = GCMRegistrar.getRegistrationId(this);
if (regId.equals("")) {
GCMRegistrar.register(this, GCMIntentService.SENDERID);
Log.v(TAG, "新設備:"+GCMRegistrar.isRegistered(this)+GCMRegistrar.getRegistrationId(this));
} else {
Log.v(TAG, "Already registered");
}
//點擊後解除注冊,不接收消息
Button btn = (Button) findViewById(R.id.unregist_btn);
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
GCMRegistrar.unregister(getBaseContext());
}
});
}
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
GCMRegistrar.checkDevice(this);
GCMRegistrar.checkManifest(this);
final String regId = GCMRegistrar.getRegistrationId(this);
if (regId.equals("")) {
GCMRegistrar.register(this, GCMIntentService.SENDERID);
Log.v(TAG, "新設備:"+GCMRegistrar.isRegistered(this)+GCMRegistrar.getRegistrationId(this));
} else {
Log.v(TAG, "Already registered");
}
//點擊後解除注冊,不接收消息
Button btn = (Button) findViewById(R.id.unregist_btn);
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
GCMRegistrar.unregister(getBaseContext());
}
});
}
checkDevice()檢查系統版本和是否裝有google service frame,否則拋出異常。(GCM服務需要安裝有谷歌服務包,且系統版本2.2及以上的才支持)
checkManifest()檢查AndroidManifest.xml文件是否有配置有必須的權限,和檢測廣播接收器是否有正確的權限和過濾器,是否可以正常接收廣播。否則拋出異常。
register()真正開始注冊一個GCM服務,它會啟動一個action名為com.google.android.c2dm.intent.REGISTER的服務。注意這個才是真正的GCM服務,而前面我們自己創建的那個其實並不是GCM服務,只是GCM整個服務機制裡面為我們提供的一個業務上的回調而已。
完整的AndroidManifest.xml文件:
[html] view plaincopyprint?<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
package="com.ives.androidgcmclient"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="15"/>
<permission
android:name="com.ives.androidgcmclient.permission.C2D_MESSAGE"
android:protectionLevel="signature"/>
<uses-permission
android:name="com.ives.androidgcmclient.permission.C2D_MESSAGE"/>
<uses-permission
android:name="com.google.android.c2dm.permission.RECEIVE"/>
<uses-permission
android:name="android.permission.INTERNET"/>
<uses-permission
android:name="android.permission.GET_ACCOUNTS"/>
<uses-permission
android:name="android.permission.WAKE_LOCK"/>
<uses-permission
android:name="android.permission.CHANGE_NETWORK_STATE">
</uses-permission>
<uses-permission
android:name="android.permission.CHANGE_WIFI_STATE">
</uses-permission>
<uses-permission
android:name="android.permission.ACCESS_NETWORK_STATE">
</uses-permission>
<uses-permission
android:name="android.permission.ACCESS_WIFI_STATE"/>
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme">
<activity
android:name="com.ives.androidgcmclient.MainActivity"
android:label="@string/app_name">
<intent-filter>
<action
android:name="android.intent.action.MAIN"/>
<category
android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<receiver
android:name="com.google.android.gcm.GCMBroadcastReceiver"
android:permission="com.google.android.c2dm.permission.SEND">
<intent-filter>
<action
android:name="com.google.android.c2dm.intent.RECEIVE"/>
<action
android:name="com.google.android.c2dm.intent.REGISTRATION"/>
<category
android:name="com.ives.androidgcmclient"/>
</intent-filter>
</receiver>
<service
android:name=".GCMIntentService"/>
</application>
</manifest>
<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
package="com.ives.androidgcmclient"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="15"/>
<permission
android:name="com.ives.androidgcmclient.permission.C2D_MESSAGE"
android:protectionLevel="signature"/>
<uses-permission
android:name="com.ives.androidgcmclient.permission.C2D_MESSAGE"/>
<uses-permission
android:name="com.google.android.c2dm.permission.RECEIVE"/>
<uses-permission
android:name="android.permission.INTERNET"/>
<uses-permission
android:name="android.permission.GET_ACCOUNTS"/>
<uses-permission
android:name="android.permission.WAKE_LOCK"/>
<uses-permission
android:name="android.permission.CHANGE_NETWORK_STATE">
</uses-permission>
<uses-permission
android:name="android.permission.CHANGE_WIFI_STATE">
</uses-permission>
<uses-permission
android:name="android.permission.ACCESS_NETWORK_STATE">
</uses-permission>
<uses-permission
android:name="android.permission.ACCESS_WIFI_STATE"/>
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme">
<activity
android:name="com.ives.androidgcmclient.MainActivity"
android:label="@string/app_name">
<intent-filter>
<action
android:name="android.intent.action.MAIN"/>
<category
android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<receiver
android:name="com.google.android.gcm.GCMBroadcastReceiver"
android:permission="com.google.android.c2dm.permission.SEND">
<intent-filter>
<action
android:name="com.google.android.c2dm.intent.RECEIVE"/>
<action
android:name="com.google.android.c2dm.intent.REGISTRATION"/>
<category
android:name="com.ives.androidgcmclient"/>
</intent-filter>
</receiver>
<service
android:name=".GCMIntentService"/>
</application>
</manifest>
博主在剛剛在學習過程中發現了一個關於android往sdcard讀寫的問題, 配置了該配置的提示無讀寫權限。 在AndroidManifest.xml文件中配置清單如下
抽象工廠模式(Abstract Factory)抽象工廠模式是對象的創建模式,它是工廠方法模式的進一步延伸和拓展的結果。抽象工廠模式更加抽象化,更具一般性特點。我們知道,
滴滴巴士是滴滴快車繼滴滴順風車、滴滴快車服務之後推出的又一便民出行服務,特別廣大上班族來說無疑是極好的,再也不用去擠公交、擠地鐵了。下面下載吧小編就給大家講
1.背景選擇器(位於res/drawable/,使用方法:android:background=”@drawable/XXX”) 復制代碼 代碼如下: <?xml