工具App for C2DM.
来源:互联网 发布:to:day软件 编辑:程序博客网 时间:2024/05/18 03:07
Google PUSH Service: Clould to Device(C2DM)来实现PUSH消息。 必须申请reg——id然后可以使用PUSH. 用来测试,服务器是否deploy完善。接受 “text", "title", "url" 作为消息体,这些是最常用的3个内容。
Client 必须知道一个senderID。 一般由服务器端的负责人来申请。http://code.google.com/android/c2dm/signup.html 可以做到。
在values/c2dm.xml中定义好senderID。 App在运行时提取。一般reg-id,从主界面获取。
User也可以在option menu(options.xml)中输入一个reg——id。界面是一个。
PreferenceActivity
c2dm.xml:
<?xml version="1.0" encoding="utf-8"?> <resources><string name="c2dm_sender_id">xxxxxx@gmail.com</string> </resources>
strings.xml:
<?xml version="1.0" encoding="utf-8"?><resources> <string name="hello">Hello World, C2DM_dummyActivity!</string> <string name="app_name">C2DM Tester</string> <string name="txt_settings_cat_title_push">Push (C2DM)</string> <string name="txt_settings_registrationId">Registration ID</string> <string name="menu_caption_preferences">Preferences</string> <string name="menu_caption_preferences_condensed">Pref</string> <string name="menu_caption_exit">Exit</string> <string name="pref_registration_id_key">registrationId</string></resources>
options.xml(menu)
<menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/menuItemPreferences" android:title="@string/menu_caption_preferences" android:titleCondensed="@string/menu_caption_preferences_condensed" android:enabled="true" android:visible="true" android:icon="@android:drawable/ic_menu_preferences"></item> <item android:id="@+id/menuItemExit" android:title="@string/menu_caption_exit" android:titleCondensed="@string/menu_caption_exit" android:enabled="true" android:visible="true" android:icon="@android:drawable/ic_menu_close_clear_cancel"></item> </menu>
settings.xml 作为人工输入reg-id:
<?xml version="1.0" encoding="utf-8"?><PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"><PreferenceCategory android:title="@string/txt_settings_cat_title_push"><EditTextPreferenceandroid:key="@string/pref_registration_id_key"android:title="@string/txt_settings_registrationId"/></PreferenceCategory></PreferenceScreen>
入口Activty:
package com.google.code.c2dmtester;import android.app.Activity;import android.app.NotificationManager;import android.app.PendingIntent;import android.content.Context;import android.content.Intent;import android.content.SharedPreferences;import android.os.Bundle;import android.util.Log;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.widget.EditText;import android.widget.Toast;import android.widget.ToggleButton;public class MainActivity extends Activity{ public final static String REGISTRATION_ID = "regid"; public final static String URL = "url"; /** Called when the activity is first created. */ @Override public void onCreate( Bundle savedInstanceState ) { super.onCreate( savedInstanceState ); setContentView( R.layout.main ); String registrationId = this.readRegistrationId(); this.setRegistrationId( registrationId ); EditText et = (EditText) findViewById( R.id.editTextPackageName ); et.setText( this.getClass().getPackage().getName() ); } private String readRegistrationId() { SharedPreferences sharedPreferences = PreferencesActivity.getSharedPreferences( this ); final String registrationId = sharedPreferences.getString( PreferencesActivity.PREF_REGISTRATION_ID, "" ); return registrationId; } @Override public boolean onCreateOptionsMenu( Menu menu ) { getMenuInflater().inflate( R.menu.options, menu ); return super.onCreateOptionsMenu( menu ); } @Override public boolean onOptionsItemSelected( MenuItem item ) { switch( item.getItemId() ) { case R.id.menuItemPreferences: Intent prefsIntent = new Intent( this, PreferencesActivity.class ); startActivity( prefsIntent ); return true; case R.id.menuItemExit: finish(); return true; } return super.onOptionsItemSelected( item ); } @Override protected void onResume() { // TODO Auto-generated method stub super.onResume(); Intent intent = getIntent(); this.onNewIntent( intent ); } private void setRegistrationId( String registrationId ) { EditText editReg = (EditText) findViewById( R.id.editRegistrationID ); editReg.setText( (CharSequence) registrationId ); ToggleButton tb = (ToggleButton) findViewById( R.id.toggleButton1 ); tb.setChecked( null != registrationId && registrationId.length() > 0 ); } @Override protected void onNewIntent( Intent intent ) { // TODO Auto-generated method stub super.onNewIntent( intent ); // clear notification (if set) final NotificationManager nm = (NotificationManager) getSystemService( Context.NOTIFICATION_SERVICE ); nm.cancel( C2dmReceiver.NOTIFICATION_ID ); intent = getIntent(); final Bundle extras = intent.getExtras(); String url = intent.getDataString(); if( extras != null ) { String registrationId = extras.getString( REGISTRATION_ID ); // String url = extras.getString(URL); if( null != registrationId ) { this.setRegistrationId( registrationId ); saveRegistrationId( registrationId ); Log.i( "regid", registrationId ); } } if( null != url ) { Toast.makeText( getBaseContext(), "url: " + url, Toast.LENGTH_LONG ).show(); Log.i( "url", url ); } } private void saveRegistrationId( String registrationId ) { SharedPreferences sharedPreferences = PreferencesActivity.getSharedPreferences( this ); SharedPreferences.Editor editor = sharedPreferences.edit(); editor.putString( PreferencesActivity.PREF_REGISTRATION_ID, registrationId ); boolean success = editor.commit(); // Toast.makeText(this, success ? "saved" : "error", Toast.LENGTH_SHORT).show(); } public void onClickShare( View view ) { Log.i( "event", "share" ); EditText editReg = (EditText) findViewById( R.id.editRegistrationID ); String regid = editReg.getText().toString(); EditText editPackage = (EditText) findViewById( R.id.editTextPackageName ); String packageName = editPackage.getText().toString(); String message = "package name: " + packageName + "\nregistration ID: " + regid; Intent sharingIntent = new Intent( Intent.ACTION_SEND ); sharingIntent.setType( "text/plain" ); sharingIntent.putExtra( android.content.Intent.EXTRA_TEXT, message ); startActivity( Intent.createChooser( sharingIntent, "Share Registration ID Using" ) ); } public void onClickToggle( View view ) { Log.i( "event", "click" ); // Toast.makeText(context, "toogle", 1000); ToggleButton tb = (ToggleButton) findViewById( R.id.toggleButton1 ); boolean b = tb.isChecked(); Log.i( "status", b ? "checked" : "unchecked" ); if( b ) { this.register(); } else { this.unregister(); } } private void register() { Toast.makeText( getBaseContext(), "registering...", Toast.LENGTH_LONG ).show(); Intent registrationIntent = new Intent( "com.google.android.c2dm.intent.REGISTER" ); registrationIntent.putExtra( "app", PendingIntent.getBroadcast( this, 0, new Intent(), 0 ) ); // boilerplate registrationIntent.putExtra( "sender", getString( R.string.c2dm_sender_id ) ); startService( registrationIntent ); } private void unregister() { Toast.makeText( getBaseContext(), "unregistering", Toast.LENGTH_SHORT ).show(); Intent unregIntent = new Intent( "com.google.android.c2dm.intent.UNREGISTER" ); unregIntent.putExtra( "app", PendingIntent.getBroadcast( this, 0, new Intent(), 0 ) ); startService( unregIntent ); setRegistrationId( "" ); saveRegistrationId( "" ); // nothing to do in this demo }}
消息处理的BroadcastReceiver:
package com.google.code.c2dmtester;import android.R;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 android.net.Uri;import android.util.Log;public class C2dmReceiver extends BroadcastReceiver{ public final static int NOTIFICATION_ID = 123; // any number will do @Override public void onReceive( Context context, Intent intent ) { if( intent.getAction().equals( "com.google.android.c2dm.intent.REGISTRATION" ) ) { String registration = intent.getStringExtra( "registration_id" ); Log.i( "regid", (null == registration) ? "(null)" : registration ); if( intent.getStringExtra( "error" ) != null ) { // handle an error for registration String title = "error receiving registration ID"; String message = registration; Intent myIntent = new Intent( context, MainActivity.class ); createNotification( context, title, message, myIntent ); } else if( intent.getStringExtra( "unregistered" ) != null ) { // call service to handle unregistration String title = "unregistering event received"; String message = registration; Intent myIntent = new Intent( context, MainActivity.class ); createNotification( context, title, message, myIntent ); } else if( registration != null ) { // call service to handle registration Intent myIntent = new Intent( context, MainActivity.class ); myIntent.putExtra( MainActivity.REGISTRATION_ID, registration ); // String title = "registration ID received"; // String message = registration; // createNotification(context, title, message, myIntent); // open activity as new task (and close older running instance // this needs to be done, if a Broadcast Receiver wants to start // an activity myIntent.addFlags( Intent.FLAG_ACTIVITY_NEW_TASK ); myIntent.addFlags( Intent.FLAG_ACTIVITY_CLEAR_TOP ); context.startActivity( myIntent ); Log.i( "C2D RegID:", registration ); } } else if( intent.getAction().equals( "com.google.android.c2dm.intent.RECEIVE" ) ) { // we are just going to say a few fields already exist here, but // this is based // on what you may be sending from above in your data fields String title = intent.getExtras().getString( "title" ); String message = intent.getExtras().getString( "text" ); String url = intent.getExtras().getString( "url" ); Intent myIntent = new Intent( context, MainActivity.class ); myIntent.putExtra( MainActivity.URL, url ); myIntent.setData( Uri.parse( url ) ); createNotification( context, title, message, myIntent ); } } private void createNotification( Context context, String title, String message, Intent myIntent ) { PendingIntent contentIntent = PendingIntent.getActivity( context, 0, myIntent, PendingIntent.FLAG_UPDATE_CURRENT ); // create the notification! int icon = R.drawable.stat_notify_chat; long when = System.currentTimeMillis(); CharSequence contentTitle, contentMessage = null; contentTitle = (CharSequence) title; contentMessage = (CharSequence) message; NotificationManager nm = (NotificationManager) context .getSystemService( Context.NOTIFICATION_SERVICE ); Notification n = new Notification( icon, contentTitle, when ); n.setLatestEventInfo( context, contentTitle, contentMessage, contentIntent ); nm.notify( C2dmReceiver.NOTIFICATION_ID, n ); // 0 can be replaced with a // number for separate style // of messages }}
reg_id存储:
package com.google.code.c2dmtester;import android.content.ContextWrapper;import android.content.SharedPreferences;import android.os.Bundle;import android.preference.PreferenceActivity;public class PreferencesActivity extends PreferenceActivity{ public final static String PREF_REGISTRATION_ID = "registrationId"; @Override protected void onCreate( Bundle savedInstanceState ) { super.onCreate( savedInstanceState ); this.addPreferencesFromResource( R.xml.settings ); } public static final SharedPreferences getSharedPreferences( final ContextWrapper ctx ) { return ctx.getSharedPreferences( ctx.getPackageName() + "_preferences", MODE_PRIVATE ); }}
manifest:
<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.google.code.c2dmtester" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="15"/> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <permission android:name="com.google.code.c2dmtester.permission.C2D_MESSAGE" android:protectionLevel="signature" /> <uses-permission android:name="com.google.code.c2dmtester.permission.C2D_MESSAGE" /> <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /> <application android:debuggable="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" > <activity android:name=".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> <activity android:name=".PreferencesActivity" > </activity> <service android:name=".C2dmReceiver" /> <receiver android:name=".C2dmReceiver" android:permission="com.google.android.c2dm.permission.SEND" > <intent-filter> <action android:name="com.google.android.c2dm.intent.RECEIVE" /> <category android:name="com.google.code.c2dmtester" /> </intent-filter> <intent-filter> <action android:name="com.google.android.c2dm.intent.REGISTRATION" /> <category android:name="com.google.code.c2dmtester" /> </intent-filter> </receiver> </application> </manifest>
- 工具App for C2DM.
- C2DM
- C2DM简介
- 安装Google App Engine for Java开发工具集
- android中的C2DM
- Android C2DM基本原理浅析
- android C2DM 框架
- Android C2DM----客户端
- App Inventor for Android
- Designing for App Sandbox
- Ionic for hello app
- Splunk App for Stream
- Web app开发工具
- APP开发工具
- 【android】app测试工具
- app图标制作工具
- iOS APP开发工具
- app自动测试工具
- java.lang.OutOfMemoryError: PermGen space及其解决方法 .
- NVDIA(英伟达)一道笔试笔试编程题
- 让windows7学会定时关机
- tomcat研究
- Windows Phone 7 学习笔记三------文本框输入作用域
- 工具App for C2DM.
- [翻译]WP7 QuickStart-第六篇-Windows Phone下文本的使用
- Android入门、源码、文档资源、教程
- 在Unity3D中应用EZGUI中的参数传递
- Scanner 和BufferedReader同样能实现将键盘输入的数据送入程序
- WP7 页面间传值
- 跑马灯
- 使用java.util.zip对字符串进行压缩和解压缩
- 并发与竞争