友盟消息推送初试

时间:2024-04-17 16:57:36

  注册与下载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。