首页 > 代码库 > 友盟消息推送初试

友盟消息推送初试

  注册与下载sdk略过,直接贴代码

<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"    package="com.monta.paopao"    android:versionCode="1"    android:versionName="1.0" >    <uses-sdk        android:minSdkVersion="8"        android:targetSdkVersion="19" />    <!-- 去掉READ_LOGS权限-->    <uses-permission android:name="android.permission.READ_LOGS" />    <uses-permission android:name="android.permission.INTERNET" />    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />    <uses-permission android:name="android.permission.READ_PHONE_STATE" />    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />    <uses-permission android:name="android.permission.WAKE_LOCK" />    <uses-permission android:name="android.permission.VIBRATE" />    <uses-permission android:name="android.permission.WRITE_SETTINGS" />    <!--开机启动添加 -->    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />    <application        android:name=".MyApplication"        android:allowBackup="true"        android:icon="@drawable/ic_launcher"        android:label="@string/app_name"        android:theme="@style/AppTheme" >        <activity            android:name="com.monta.paopao.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="com.monta.paopao.TestActivity" />
    <!-- 测试用,可删除 -->
<activity android:name="com.monta.paopao.TwoActivity" /> <receiver android:name="com.umeng.message.NotificationProxyBroadcastReceiver" android:exported="false" > </receiver> <receiver android:name="com.umeng.message.RegistrationReceiver" > <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> </intent-filter> <intent-filter> <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.PACKAGE_REMOVED" /> <data android:scheme="package" /> </intent-filter> </receiver> <receiver android:name="com.umeng.message.UmengBroadcastReceiver" > <intent-filter> <action android:name="org.agoo.android.intent.action.RECEIVE" /> </intent-filter> <intent-filter> <action android:name="com.monta.paopao.intent.action.COMMAND" /> </intent-filter> <intent-filter> <action android:name="org.agoo.android.intent.action.RE_ELECTION_V2" /> </intent-filter> </receiver> <service android:name="com.umeng.message.UmengService" android:exported="true" android:process=":umengService_v1" > <intent-filter> <action android:name="com.monta.paopao.intent.action.START" /> </intent-filter> <intent-filter> <action android:name="com.monta.paopao.intent.action.COCKROACH" /> </intent-filter> <intent-filter> <action android:name="org.agoo.android.intent.action.PING" /> </intent-filter> </service> <service android:name="org.android.agoo.service.ElectionService" android:exported="true" android:process=":umengService_v1" > <intent-filter> <action android:name="org.agoo.android.intent.action.ELECTION_V2" /> </intent-filter> </service> <service android:name="com.umeng.message.UmengIntentService" /> <meta-data android:name="UMENG_APPKEY" android:value="****" > </meta-data> <meta-data android:name="UMENG_MESSAGE_SECRET" android:value="*******" > </meta-data> <meta-data android:name="UMENG_CHANNEL" android:value="Umeng" > </meta-data> <!-- If you donot want to use the standard notification bar in SDK, you can define IntentService instead to handle message. --> <!-- 自定义消息接收service -->
<service android:name="com.monta.paopao.MyPushIntentService" /> <service android:name="com.umeng.message.UmengDownloadResourceService" > </service>

  <!-- startReceiver 用来设置开机启动 消息推送的接收service -->

   <receiver android:name="com.monta.paopao.StartReceiver">             <intent-filter>                      <action android:name="android.intent.action.BOOT_COMPLETED"></action>                      <category android:name="android.intent.category.LAUNCHER" />                  </intent-filter>              </receiver>      </application>

其中com.monta.paopao 为推送应用包名。 

 

接下来是自定义的 application

package com.monta.paopao;import android.app.Application;import android.app.Notification;import android.content.Context;import android.content.Intent;import android.os.Handler;import android.support.v4.app.NotificationCompat;import android.util.Log;import android.widget.RemoteViews;import android.widget.Toast;import com.monta.paopao.R;import com.umeng.message.PushAgent;import com.umeng.message.UTrack;import com.umeng.message.UmengMessageHandler;import com.umeng.message.UmengNotificationClickHandler;import com.umeng.message.UmengRegistrar;import com.umeng.message.entity.UMessage;public class MyApplication extends Application {    private static final String TAG = MyApplication.class.getName();    private PushAgent mPushAgent;    @Override    public void onCreate() {        mPushAgent = PushAgent.getInstance(this);        mPushAgent.setDebugMode(true);                        /**         * 该Handler是在IntentService中被调用,故         * 1. 如果需启动Activity,需添加Intent.FLAG_ACTIVITY_NEW_TASK         * 2. IntentService里的onHandleIntent方法是并不处于主线程中,因此,如果需调用到主线程,需如下所示;         *           或者可以直接启动Service         * */        UmengMessageHandler messageHandler = new UmengMessageHandler(){            @Override            public void dealWithCustomMessage(final Context context, final UMessage msg) {                                                new Handler(getMainLooper()).post(new Runnable() {                                        @Override                    public void run() {                        UTrack.getInstance(getApplicationContext()).trackMsgClick(msg);                        Toast.makeText(context, msg.custom, Toast.LENGTH_LONG).show();                                            }                });            }                        @Override            public Notification getNotification(Context context,                    UMessage msg) {                switch (msg.builder_id) {                case 1:                    NotificationCompat.Builder builder = new NotificationCompat.Builder(context);                    RemoteViews myNotificationView = new RemoteViews(context.getPackageName(), R.layout.notification_view);                    myNotificationView.setTextViewText(R.id.notification_title, msg.title);                    myNotificationView.setTextViewText(R.id.notification_text, msg.text);                    myNotificationView.setImageViewBitmap(R.id.notification_large_icon, getLargeIcon(context, msg));                    myNotificationView.setImageViewResource(R.id.notification_small_icon, getSmallIconId(context, msg));                    builder.setContent(myNotificationView);                    builder.setAutoCancel(true);                    Notification mNotification = builder.build();                    //由于Android v4包的bug,在2.3及以下系统,Builder创建出来的Notification,并没有设置RemoteView,故需要添加此代码                    mNotification.contentView = myNotificationView;                    return mNotification;                default:                    //默认为0,若填写的builder_id并不存在,也使用默认。                    return super.getNotification(context, msg);                }            }        };        mPushAgent.setMessageHandler(messageHandler);        /**         * 该Handler是在BroadcastReceiver中被调用,故         * 如果需启动Activity,需添加Intent.FLAG_ACTIVITY_NEW_TASK         * */        UmengNotificationClickHandler notificationClickHandler = new UmengNotificationClickHandler(){            @Override            public void dealWithCustomAction(Context context, UMessage msg) {                Toast.makeText(context, msg.custom, Toast.LENGTH_LONG).show();            }        };        mPushAgent.setNotificationClickHandler(notificationClickHandler);        String device_token = UmengRegistrar.getRegistrationId(this);        Log.i("device_token", device_token);            }}

完全照搬推送demo中的application

 

接下来是重头戏 mainActivity

/** * Copyright (C) 2013 Umeng, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */package com.monta.paopao;import java.util.ArrayList;import java.util.List;import java.util.Set;import android.annotation.SuppressLint;import android.annotation.TargetApi;import android.app.Activity;import android.app.Notification;import android.app.ProgressDialog;import android.content.ClipboardManager;import android.content.Context;import android.content.Intent;import android.os.AsyncTask;import android.os.Build;import android.os.Bundle;import android.os.Handler;import android.support.v4.app.NotificationCompat;import android.text.TextUtils;import android.util.Log;import android.view.View;import android.view.View.OnClickListener;import android.view.inputmethod.InputMethodManager;import android.widget.Button;import android.widget.EditText;import android.widget.ImageView;import android.widget.RemoteViews;import android.widget.TextView;import android.widget.Toast;import com.monta.paopao.R;import com.umeng.message.ALIAS_TYPE;import com.umeng.message.IUmengRegisterCallback;import com.umeng.message.IUmengUnregisterCallback;import com.umeng.message.PushAgent;import com.umeng.message.UTrack;import com.umeng.message.UmengMessageHandler;import com.umeng.message.UmengNotificationClickHandler;import com.umeng.message.UmengRegistrar;import com.umeng.message.entity.UMessage;import com.umeng.message.tag.TagManager;public class MainActivity extends Activity {    protected static final String TAG = MainActivity.class.getSimpleName();        //------------设置标签等控件,demo中有,暂时先不考虑------------//    private EditText edTag, edAlias;    private TextView tvStatus, infoTextView;    private ImageView btnEnable;    private Button btnaAddTag, btnListTag, btnAddAlias;     private ProgressDialog dialog;    //------------设置标签等控件,demo中有,暂时先不考虑------------//        private PushAgent mPushAgent;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);                printKeyValue();                mPushAgent = PushAgent.getInstance(this);        mPushAgent.onAppStart();        mPushAgent.enable(mRegisterCallback);                        //------------设置标签等控件,demo中有,暂时先不考虑------------//        tvStatus = (TextView) findViewById(R.id.tvStatus);        btnEnable = (ImageView) findViewById(R.id.btnEnable);        btnaAddTag = (Button) findViewById(R.id.btnAddTags);        btnAddAlias = (Button) findViewById(R.id.btnAddAlias);        btnListTag = (Button) findViewById(R.id.btnListTags);        infoTextView = (TextView)findViewById(R.id.info);        edTag = (EditText) findViewById(R.id.edTag);        edAlias = (EditText) findViewById(R.id.edAlias);                tvStatus.setOnClickListener(clickListener);        btnEnable.setOnClickListener(clickListener);        btnaAddTag.setOnClickListener(clickListener);        btnListTag.setOnClickListener(clickListener);        btnAddAlias.setOnClickListener(clickListener);        updateStatus();        //------------设置标签等控件,demo中有,暂时先不考虑------------//                //------------重点!!! 以下两行设置通过myPushIntentService来处理推送来的消息,其他代码块暂时不做处理------------//        mPushAgent.setPushIntentServiceClass(MyPushIntentService.class);        mPushAgent.getMessageHandler();    }    @Override    protected void onDestroy() {        Log.d("-------------------------", "onDestroy");        super.onDestroy();    }    private void printKeyValue() {        //获取自定义参数        Bundle bun = getIntent().getExtras();        if (bun != null)        {            Set<String> keySet = bun.keySet();            for (String key : keySet) {                String value = bun.getString(key);                Log.i(TAG, key + ":" + value);            }        }            }    private void switchPush(){                String info = String.format("enabled:%s  isRegistered:%s",                mPushAgent.isEnabled(), mPushAgent.isRegistered());        Log.i(TAG, "switch Push:" + info);        btnEnable.setClickable(false);        if (mPushAgent.isEnabled() || UmengRegistrar.isRegistered(MainActivity.this)) {            mPushAgent.disable(mUnregisterCallback);        } else {            mPushAgent.enable(mRegisterCallback);        }    }        private void updateStatus() {        String pkgName = getApplicationContext().getPackageName();        String info = String.format("enabled:%s  isRegistered:%s  DeviceToken:%s",                mPushAgent.isEnabled(), mPushAgent.isRegistered(),                mPushAgent.getRegistrationId());        tvStatus.setText("应用包名:"+pkgName+"\n"+info);                btnEnable.setImageResource(mPushAgent.isEnabled()?R.drawable.open_button:R.drawable.close_button);        btnEnable.setClickable(true);        copyToClipBoard();                Log.i(TAG, "updateStatus:" + String.format("enabled:%s  isRegistered:%s",                mPushAgent.isEnabled(), mPushAgent.isRegistered()));        Log.i(TAG, "=============================");    }    @TargetApi(Build.VERSION_CODES.HONEYCOMB)    @SuppressLint("NewApi")    @SuppressWarnings("deprecation")    private void copyToClipBoard()    {        if (Build.VERSION.SDK_INT<11)             return;        String deviceToken = mPushAgent.getRegistrationId();        if (!TextUtils.isEmpty(deviceToken))        {            ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);            clipboard.setText(deviceToken);            toast("DeviceToken已经复制到剪贴板了");                }    }        // sample code to add tags for the device / user    private void addTag() {        String tag = edTag.getText().toString();        if (TextUtils.isEmpty(tag))        {            toast("请先输入Tag");            return;        }        if (!mPushAgent.isRegistered())        {            toast("抱歉,还未注册");            return;        }        showLoading();        new AddTagTask(tag).execute();        hideInputKeyboard();    }    // sample code to add tags for the device / user    private void listTags() {        if (!mPushAgent.isRegistered())        {            toast("抱歉,还未注册");            return;        }        showLoading();        new ListTagTask().execute();    }    // sample code to add alias for the device / user    private void addAlias() {        String alias = edAlias.getText().toString();        if (TextUtils.isEmpty(alias))        {            toast("请先输入Alias");            return;        }        if (!mPushAgent.isRegistered())        {            toast("抱歉,还未注册");            return;        }        showLoading();        new AddAliasTask(alias).execute();        hideInputKeyboard();    }    public void showLoading(){        if (dialog == null){            dialog = new ProgressDialog(this);            dialog.setMessage("Loading");        }        dialog.show();    }        public void updateInfo(String info){        if (dialog != null && dialog.isShowing())            dialog.dismiss();        infoTextView.setText(info);    }        public OnClickListener clickListener  = new OnClickListener() {                @Override        public void onClick(View v) {            // TODO Auto-generated method stub            if (v == btnaAddTag){                addTag();            }else if (v == btnAddAlias){                addAlias();            }else if (v == btnListTag){                Intent intent = new Intent(getApplicationContext(), TwoActivity.class);                startActivity(intent);                finish();//                listTags();            }else if (v == btnEnable){                switchPush();            }else if (v == tvStatus) {                updateStatus();            }        }    };            public Handler handler = new Handler();    public IUmengRegisterCallback mRegisterCallback = new IUmengRegisterCallback() {                @Override        public void onRegistered(String registrationId) {            // TODO Auto-generated method stub            handler.post(new Runnable() {                                @Override                public void run() {                    // TODO Auto-generated method stub                    updateStatus();                }            });        }    };        public IUmengUnregisterCallback mUnregisterCallback = new IUmengUnregisterCallback() {                @Override        public void onUnregistered(String registrationId) {            // TODO Auto-generated method stub            handler.post(new Runnable() {                                @Override                public void run() {                    // TODO Auto-generated method stub                    updateStatus();                }            });        }    };        private Toast mToast;    public void toast(String str){        if (mToast == null)            mToast = Toast.makeText(this, "", Toast.LENGTH_SHORT);        mToast.setText(str);        mToast.show();    }            class AddTagTask extends AsyncTask<Void, Void, String>{        String tagString;        String[] tags;        public AddTagTask(String tag) {            // TODO Auto-generated constructor stub            tagString = tag;            tags = tagString.split(",");        }                @Override        protected String doInBackground(Void... params) {            // TODO Auto-generated method stub            try {                TagManager.Result result = mPushAgent.getTagManager().add(tags);                Log.d(TAG, result.toString());                return result.toString();            } catch (Exception e) {                e.printStackTrace();            }            return null;        }                @Override        protected void onPostExecute(String result) {            edTag.setText("");            updateInfo("Add Tag:\n" + result);        }    }        class AddAliasTask extends AsyncTask<Void, Void, Boolean>{                String alias;                public AddAliasTask(String aliasString) {            // TODO Auto-generated constructor stub            this.alias = aliasString;        }                protected Boolean doInBackground(Void... params) {            try {                return mPushAgent.addAlias(alias, ALIAS_TYPE.SINA_WEIBO);            } catch (Exception e) {                e.printStackTrace();            }            return false;        }        @Override        protected void onPostExecute(Boolean result) {            if (Boolean.TRUE.equals(result))                 Log.i(TAG, "alias was set successfully.");                        edAlias.setText("");            updateInfo("Add Alias:" + (result?"Success":"Fail"));        }    }        class ListTagTask extends AsyncTask<Void , Void, List<String>>{        @Override        protected List<String> doInBackground(Void... params) {            List<String> tags = new ArrayList<String>();            try {                tags = mPushAgent.getTagManager().list();                Log.d(TAG, String.format("list tags: %s", TextUtils.join(",", tags)));            } catch (Exception e) {                e.printStackTrace();            }            return tags;        }        @Override        protected void onPostExecute(List<String> result) {            if (result != null) {                StringBuilder info = new StringBuilder();                info.append("Tags:\n");                for (int i=0; i<result.size(); i++){                    String tag = result.get(i);                    info.append(tag+"\n");                }                info.append("\n");                updateInfo(info.toString());            }            updateInfo("");        }    }        public void hideInputKeyboard()    {        ((InputMethodManager) getSystemService(INPUT_METHOD_SERVICE))        .hideSoftInputFromWindow(getCurrentFocus()        .getWindowToken(),        InputMethodManager.HIDE_NOT_ALWAYS);    }}

 

接下来是自定义的service ,用于接收处理推送来的消息。

package com.monta.paopao;import org.android.agoo.client.BaseConstants;import org.json.JSONObject;import android.app.Notification;import android.content.Context;import android.content.Intent;import android.support.v4.app.NotificationCompat;import android.widget.RemoteViews;import com.umeng.common.message.Log;import com.umeng.message.UmengBaseIntentService;import com.umeng.message.entity.UMessage;/** * Developer defined push intent service.  * Remember to call {@link com.umeng.message.PushAgent#setPushIntentServiceClass(Class)}.  * @author lucas * */public class MyPushIntentService extends UmengBaseIntentService{    private static final String TAG = MyPushIntentService.class.getName();    @Override    protected void onMessage(Context context, Intent intent) {        Log.d("onMessage", "onMessageonMessageonMessageonMessageonMessageonMessageonMessageonMessage");        super.onMessage(context, intent);        try {            String message = intent.getStringExtra(BaseConstants.MESSAGE_BODY);            UMessage msg = new UMessage(new JSONObject(message));            android.util.Log.d(TAG, "-----------------------------");            Log.d(TAG, "message="+"----------------------------------");            Log.d(TAG, "message="+message);            Log.d(TAG, "custom="+msg.custom);            Log.d(TAG, "message="+"----------------------------------");            android.util.Log.d(TAG, "-----------------------------");        } catch (Exception e) {            Log.e(TAG, e.getMessage());        }    }}

经过测试,服务器推送来的消息可以通过这个MyPushIntentService  onMessage方法中接收到,弹出消息框等问题待下一步进行处理。

接下来就是最后一步,设置开机启动推送接收服务MyPushIntentService ,通过广播接收者StartReceiver实现:

package com.monta.paopao;import com.umeng.message.PushAgent;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.util.Log;public class StartReceiver extends BroadcastReceiver {    @Override    public void onReceive(Context context, Intent intent) {        Log.i("--------------------", "开机启动楼~~~~");        PushAgent mPushAgent = PushAgent.getInstance(context);        mPushAgent.onAppStart();        mPushAgent.setPushIntentServiceClass(MyPushIntentService.class);        mPushAgent.getMessageHandler();    }}

 

资源文档等仍为原demo,至此基本的android推送自定义接收处理完成,更深入的处理学习理解完成后再贴出code。

 

友盟消息推送初试