• 基于百度云推送的实时通信客户端实现(三)


    昨天已经说到了聊天列表的实现,今天来说说聊天界面的实现

    在聊天界面会有两种布局,一种是

    用户发送的消息的布局

    另外一种是

    用户收到的消息的布局

    所以在这个时候Adapter的布局就需要对应两种界面,代码很简单

     1 <?xml version="1.0" encoding="utf-8"?>
     2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     3     android:layout_width="fill_parent"
     4     android:layout_height="wrap_content"
     5     android:layout_marginLeft="10dp"
     6     android:background="#eeeeee"
     7     android:gravity="right"
     8     android:orientation="horizontal" >
     9 
    10     <LinearLayout
    11         android:layout_width="180dp"
    12         android:layout_height="wrap_content"
    13         android:background="@drawable/outgoing"
    14         android:orientation="vertical" >
    15 
    16         <LinearLayout
    17             android:layout_width="fill_parent"
    18             android:layout_height="match_parent"
    19             android:orientation="vertical" >
    20 
    21             <TextView
    22                 android:id="@+id/person_name"
    23                 android:layout_width="fill_parent"
    24                 android:layout_height="0dp"
    25                 android:layout_weight="1"
    26                 android:textColor="#000000"
    27                 android:textSize="16sp" />
    28 
    29             <TextView
    30                 android:id="@+id/time_say"
    31                 android:layout_width="fill_parent"
    32                 android:layout_height="0dp"
    33                 android:layout_weight="1"
    34                 android:textColor="#69abcd"
    35                 android:textSize="16sp" />
    36         </LinearLayout>
    37 
    38         <TextView
    39             android:id="@+id/item_say"
    40             android:layout_width="fill_parent"
    41             android:layout_height="match_parent"
    42             android:textColor="#000000"
    43             android:textSize="16sp" />
    44     </LinearLayout>
    45 
    46     <ImageView
    47         android:id="@+id/person_icon"
    48         android:layout_width="42dp"
    49         android:layout_height="42dp"
    50         android:layout_gravity="bottom"
    51         android:background="@drawable/retouxiang"
    52         android:contentDescription="@string/app_name" />
    53 
    54 </LinearLayout>
    list_talk_me_item.xml
     1 <?xml version="1.0" encoding="utf-8"?>
     2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     3     android:layout_width="fill_parent"
     4     android:layout_height="wrap_content"
     5     android:layout_marginLeft="10dp"
     6     android:background="#eeeeee"
     7     android:orientation="horizontal" >
     8 
     9     <ImageView
    10         android:id="@+id/person_icon"
    11         android:layout_width="42dp"
    12         android:layout_height="42dp"
    13         android:layout_gravity="bottom"
    14         android:background="@drawable/retouxiang"
    15         android:contentDescription="@string/app_name" />
    16 
    17     <LinearLayout
    18         android:layout_width="180dp"
    19         android:layout_height="wrap_content"
    20         android:background="@drawable/incoming"
    21         android:orientation="vertical" >
    22 
    23         <LinearLayout
    24             android:layout_width="fill_parent"
    25             android:layout_height="match_parent"
    26             android:orientation="vertical" >
    27 
    28             <TextView
    29                 android:id="@+id/person_name"
    30                 android:layout_width="fill_parent"
    31                 android:layout_height="0dp"
    32                 android:layout_weight="1"
    33                 android:textColor="#000000"
    34                 android:textSize="16sp" />
    35 
    36             <TextView
    37                 android:id="@+id/time_say"
    38                 android:layout_width="fill_parent"
    39                 android:layout_height="0dp"
    40                 android:layout_weight="1"
    41                 android:textColor="#69abcd"
    42                 android:textSize="16sp" />
    43         </LinearLayout>
    44 
    45         <TextView
    46             android:id="@+id/item_say"
    47             android:layout_width="fill_parent"
    48             android:layout_height="match_parent"
    49             android:textColor="#000000"
    50             android:textSize="16sp" />
    51     </LinearLayout>
    52 
    53 </LinearLayout>
    list_talk_he_item.xml

    其实两个布局基本上是一样的,只是ImagineView的位置在左侧或者在右侧的区别,另外,在这里的背景图片使用的是.9.png的格式,为了能够有更好的拉伸效果,不至于在拉伸以后失真

    在这里,同样需要创建一个类MessageEnity来存储消息的内容

     1 package com.demo.Adapter;
     2 
     3 public class MessageEnity {
     4 
     5     @SuppressWarnings("unused")
     6     private static final String TAG = MessageEnity.class.getSimpleName();
     7 
     8     private String fromUser;
     9 
    10     private String time;
    11 
    12     private String context;
    13 
    14     private String toUser;
    15 
    16     private int LayoutID;
    17 
    18     public String getfromUser() {
    19         return fromUser;
    20     }
    21 
    22     public void setfroUser(String fromUser) {
    23         this.fromUser = fromUser;
    24     }
    25 
    26     public String gettomUser() {
    27         return toUser;
    28     }
    29 
    30     public void settoUser(String toUser) {
    31         this.toUser = toUser;
    32     }
    33 
    34     public String getTime() {
    35         return time;
    36     }
    37 
    38     public void setTime(String date) {
    39         this.time = date;
    40     }
    41 
    42     public String getItem() {
    43         return context;
    44     }
    45 
    46     public void setItem(String text) {
    47         this.context = text;
    48     }
    49 
    50     public int getLayoutID() {
    51         return LayoutID;
    52     }
    53 
    54     public void setLayoutID(int LayoutID) {
    55         this.LayoutID = LayoutID;
    56     }
    57 
    58     public MessageEnity() {
    59     }
    60 
    61     public MessageEnity(String fromUser, String toUser, String date,
    62             String text, int LayoutID) {
    63         this.fromUser = fromUser;
    64         this.toUser = toUser;
    65         this.time = date;
    66         this.context = text;
    67         this.LayoutID = LayoutID;
    68     }
    69 
    70     public MessageEnity(String message,String toUser, String date, int LayoutID) {
    71         String[] messages = message.split("@#@");
    72         this.fromUser = messages[0];
    73         this.context = messages[1];
    74         this.toUser = toUser;
    75         this.time = date;
    76         this.LayoutID = LayoutID;
    77     }
    78 }
    MessageEnity

    在这里的Adapter的代码

      1 package com.demo.Adapter;
      2 
      3 import java.util.List;
      4 
      5 import com.tuisong.R;
      6 
      7 import android.content.Context;
      8 import android.database.DataSetObserver;
      9 import android.view.LayoutInflater;
     10 import android.view.View;
     11 import android.view.ViewGroup;
     12 import android.widget.BaseAdapter;
     13 import android.widget.LinearLayout;
     14 import android.widget.TextView;
     15 
     16 public class NewAdapterView extends BaseAdapter {
     17 
     18     @SuppressWarnings("unused")
     19     private static final String TAG = NewAdapterView.class.getSimpleName();
     20 
     21     private List<MessageEnity> coll;
     22 
     23     private Context context;
     24 
     25     // 构造函数
     26     public NewAdapterView(Context context, List<MessageEnity> list) {
     27         this.context = context;
     28         this.coll = list;
     29     }
     30 
     31     public boolean areAllItemsEnabled() {
     32         return false;
     33     }
     34 
     35     public boolean isEnabled(int arg0) {
     36         return false;
     37     }
     38 
     39     @Override
     40     public int getCount() {
     41         // TODO Auto-generated method stub
     42         return coll.size();
     43     }
     44 
     45     @Override
     46     public Object getItem(int arg0) {
     47         // TODO Auto-generated method stub
     48         return coll.get(arg0);
     49     }
     50 
     51     @Override
     52     public long getItemId(int arg0) {
     53         // TODO Auto-generated method stub
     54         return arg0;
     55     }
     56 
     57     public int getItemViewType(int position) {
     58         return position;
     59     }
     60 
     61     @Override
     62     public View getView(int positon, View convertView, ViewGroup parent) {
     63         // TODO Auto-generated method stub
     64         MessageEnity entity = coll.get(positon);
     65         int itemLayout = entity.getLayoutID();
     66 
     67         LinearLayout layout = new LinearLayout(context);
     68         LayoutInflater inflater = (LayoutInflater) context
     69                 .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
     70         inflater.inflate(itemLayout, layout, true);
     71 
     72         TextView tvName = (TextView) layout.findViewById(R.id.person_name);
     73         tvName.setText(entity.getfromUser());
     74 
     75         TextView tvData = (TextView) layout.findViewById(R.id.time_say);
     76         tvData.setText(entity.getTime());
     77 
     78         TextView tvItem = (TextView) layout.findViewById(R.id.item_say);
     79         tvItem.setText(entity.getItem());
     80 
     81         return layout;
     82     }
     83 
     84     public int getViewTypeCount() {
     85         return coll.size();
     86     }
     87 
     88     public boolean hasStableIds() {
     89         return false;
     90     }
     91 
     92     public boolean isEmpty() {
     93         return false;
     94     }
     95 
     96     public void registerDataSetObserver(DataSetObserver observer) {
     97     }
     98 
     99     public void unregisterDataSetObserver(DataSetObserver observer) {
    100     }
    101 
    102 }
    NewAdapterView

    然后现在上Activity的代码,其实很简单

      1 package com.baidu.push.example;
      2 
      3 import java.io.IOException;
      4 import java.io.UnsupportedEncodingException;
      5 import java.util.ArrayList;
      6 import java.util.List;
      7 
      8 import org.apache.http.HttpResponse;
      9 import org.apache.http.NameValuePair;
     10 import org.apache.http.client.ClientProtocolException;
     11 import org.apache.http.client.entity.UrlEncodedFormEntity;
     12 import org.apache.http.client.methods.HttpPost;
     13 import org.apache.http.impl.client.DefaultHttpClient;
     14 import org.apache.http.message.BasicNameValuePair;
     15 import org.apache.http.protocol.HTTP;
     16 
     17 import com.demo.Adapter.MessageEnity;
     18 import com.demo.Adapter.NewAdapterView;
     19 import com.tuisong.GetDate;
     20 import com.tuisong.R;
     21 import com.tuisong.Save_Read;
     22 
     23 import com.tuisong.db.DBHelpter;
     24 
     25 import android.app.Activity;
     26 import android.app.ProgressDialog;
     27 import android.content.BroadcastReceiver;
     28 import android.content.Context;
     29 import android.content.Intent;
     30 import android.content.SharedPreferences;
     31 import android.os.Bundle;
     32 import android.os.Handler;
     33 import android.os.Message;
     34 import android.view.View;
     35 import android.view.View.OnClickListener;
     36 import android.view.inputmethod.InputMethodManager;
     37 import android.widget.AdapterView;
     38 import android.widget.Button;
     39 import android.widget.EditText;
     40 import android.widget.LinearLayout;
     41 import android.widget.ListAdapter;
     42 import android.widget.ListView;
     43 import android.widget.RelativeLayout;
     44 import android.widget.Toast;
     45 
     46 public class TalkActivity extends Activity {
     47     @SuppressWarnings("unused")
     48     private static final String TAG = TalkActivity.class.getSimpleName();
     49 
     50     private Button messageSend;
     51 
     52     private EditText messageEdit;
     53 
     54     private static ListView messageList;
     55 
     56     public static DBHelpter help;
     57 
     58     public static String openid;
     59 
     60     public int statuecode = 0;
     61 
     62     public static String userid;
     63 
     64     public List<NameValuePair> param;
     65 
     66     private static List<MessageEnity> list;
     67 
     68     private static NewAdapterView adapter;
     69 
     70     public SharedPreferences sp;
     71     public String responcecode;
     72     public ProgressDialog dialog;
     73     public Handler handler;
     74 
     75     @Override
     76     protected void onCreate(Bundle savedInstanceState) {
     77         super.onCreate(savedInstanceState);
     78         setContentView(R.layout.activity_talk);
     79 
     80         @SuppressWarnings("unused")
     81         
     82 
     83         list = new ArrayList<MessageEnity>();
     84         help = new DBHelpter(this);
     85 
     86         Intent intent = getIntent();
     87         openid = intent.getStringExtra("name");
     88         userid = intent.getStringExtra("userid");
     89         System.out.println("the name is " + openid);
     90         System.out.println("the namee is " + userid);
     91         sp = this.getSharedPreferences("key", 0);
     92         SharedPreferences.Editor edtior = sp.edit();
     93         edtior.putString("SSP", openid);
     94         edtior.commit();
     95         messageList = (ListView) findViewById(R.id.messagelist);
     96         messageSend = (Button) findViewById(R.id.messageSend);
     97         messageEdit = (EditText) findViewById(R.id.messageEdit);
     98 
     99         list = help.findPersonMessage(openid, userid);
    100 
    101         adapter = new NewAdapterView(TalkActivity.this, list);
    102         messageList.setAdapter(adapter);
    103 
    104         messageSend.setOnClickListener(new OnClickListener() {
    105 
    106             @Override
    107             public void onClick(View arg0) {
    108 
    109                 
    110                 System.out.println("the openid is " + openid
    111                         + "  the userid is  " + userid);
    112                 final MessageEnity message = new MessageEnity(userid, openid,
    113                         GetDate.getDate(), getText(),
    114                         R.layout.list_talk_me_item);
    115                 list.add(message);
    116                 messageList.setAdapter(new NewAdapterView(TalkActivity.this,
    117                         list));
    118                 param = new ArrayList<NameValuePair>();
    119                 param.add(new BasicNameValuePair("fromuser", userid));
    120                 param.add(new BasicNameValuePair("touser", openid));
    121                 param.add(new BasicNameValuePair("message", getText()));
    122                 new Thread() {
    123                     @Override
    124                     public void run() {
    125                         // TODO Auto-generated method stub
    126 
    127                         SendMessage(getText());
    128                         if (responcecode.equals("kf102")) {
    129                             Toast.makeText(TalkActivity.this, "errsr",
    130                                     Toast.LENGTH_SHORT).show();
    131                         } else if (responcecode.equals("kf404")) {
    132                             Toast.makeText(TalkActivity.this, "eeeee",
    133                                     Toast.LENGTH_SHORT).show();
    134                         } else if (responcecode.equals("kf500")) {
    135                             Toast.makeText(TalkActivity.this, "servicr error",
    136                                     Toast.LENGTH_SHORT).show();
    137                         } else {
    138                             // 把信息插入数据库
    139                             help.Insert(message);
    140                         }
    141                     }
    142                 }.start();
    143                 while (responcecode == null) {
    144                 }
    145                 // handler.sendEmptyMessage(0);
    146                 System.out.println("the statue code is " + responcecode);
    147 
    148                 messageEdit.setText("");
    149             }
    150         });
    151 
    152     }
    153 
    154     @Override
    155     protected void onResume() {
    156         // TODO Auto-generated method stub
    157         super.onResume();
    158         sp = this.getSharedPreferences("key", 0);
    159         SharedPreferences.Editor edtior = sp.edit();
    160         edtior.putString("SSP", openid);
    161         edtior.commit();
    162         // finish();
    163     }
    164 
    165     @Override
    166     protected void onDestroy() {
    167         // TODO Auto-generated method stub
    168         super.onDestroy();
    169         sp = this.getSharedPreferences("key", 0);
    170         SharedPreferences.Editor edtior = sp.edit();
    171         edtior.putString("SSP", openid);
    172         edtior.commit();
    173     }
    174 
    175     
    176 
    177     private String getText() {
    178         return messageEdit.getText().toString();
    179     }
    180 
    181     public void SendMessage(String text) {
    182         HttpPost post = new HttpPost(
    183                 "http://kefuweixin.chinacloudsites.cn/Message/SendMessage");
    184         try {
    185             post.setEntity(new UrlEncodedFormEntity(param, HTTP.UTF_8));
    186             HttpResponse responce = new DefaultHttpClient().execute(post);
    187             responcecode = Save_Read.Change(responce);
    188 
    189         } catch (UnsupportedEncodingException e) {
    190             // TODO Auto-generated catch block
    191             e.printStackTrace();
    192         } catch (ClientProtocolException e) {
    193             // TODO Auto-generated catch block
    194             e.printStackTrace();
    195         } catch (IOException e) {
    196             // TODO Auto-generated catch block
    197             e.printStackTrace();
    198         }
    199 
    200     }
    201 }
    TalkActivity

    在这里主要还是监听各个状态,表示当前活动Activity的状态

    另外还有最重要的东西了,在后台监听推送消息的service

     1 package com.baidu.push.example;
     2 
     3 import android.app.AlertDialog;
     4 import android.app.Notification;
     5 import android.app.NotificationManager;
     6 import android.app.PendingIntent;
     7 import android.content.BroadcastReceiver;
     8 import android.content.Context;
     9 import android.content.Intent;
    10 import android.content.SharedPreferences;
    11 import android.util.Log;
    12 
    13 import com.baidu.android.pushservice.PushConstants;
    14 import com.demo.Adapter.MessageEnity;
    15 import com.tuisong.GetDate;
    16 import com.tuisong.R;
    17 import com.tuisong.db.DBHelpter;
    18 
    19 /**
    20  * Push消息处理receiver
    21  */
    22 public class PushMessageReceiver extends BroadcastReceiver {
    23     /** TAG to Log */
    24     public static final String TAG = PushMessageReceiver.class.getSimpleName();
    25     public DBHelpter help;
    26     public static final int LYDH = R.layout.list_talk_he_item;
    27 
    28     public static int NOTIFICATION_ID = 21321;
    29     AlertDialog.Builder builder;
    30     String content;
    31     Context context;
    32     public SharedPreferences sp;
    33 
    34     /**
    35      * @param context
    36      *            Context
    37      * @param intent
    38      *            接收的intent
    39      */
    40     @Override
    41     public void onReceive(final Context context, Intent intent) {
    42         this.context = context;
    43         sp = context.getSharedPreferences("key", 0);
    44         help = new DBHelpter(context);
    45 
    46         if (intent.getAction().equals(PushConstants.ACTION_MESSAGE)) {
    47             // 获取消息内容
    48             String message = intent.getExtras().getString(
    49                     PushConstants.EXTRA_PUSH_MESSAGE_STRING);
    50             System.out.println("message is in servce " + message);
    51             String toUser = sp.getString("toUser", null);
    52             System.out.println("the user id is " + toUser);
    53             MessageEnity entity = new MessageEnity(message, toUser,
    54                     GetDate.getDate(), LYDH);
    55             content = entity.getItem();
    56             System.out.println(entity.toString());
    57             help.Insert(entity);
    58 
    59             // 消息的用户自定义内容读取方式
    60             Log.i(TAG, "onMessage: " + message);
    61 
    62             // 自定义内容的json串
    63             Log.d(TAG,
    64                     "EXTRA_EXTRA = "
    65                             + intent.getStringExtra(PushConstants.EXTRA_EXTRA));
    66             System.out.println("the string is " + sp.getString("SSP", null));
    67             
    68             
    69 
    70         } else if (intent.getAction().equals(PushConstants.ACTION_RECEIVE)) {
    71             // 处理绑定等方法的返回数据
    72             // PushManager.startWork()的返回值通过PushConstants.METHOD_BIND得到
    73 
    74             // 获取方法
    75             final String method = intent
    76                     .getStringExtra(PushConstants.EXTRA_METHOD);
    77             // 方法返回错误码。若绑定返回错误(非0),则应用将不能正常接收消息。
    78             // 绑定失败的原因有多种,如网络原因,或access token过期。
    79             // 请不要在出错时进行简单的startWork调用,这有可能导致死循环。
    80             // 可以通过限制重试次数,或者在其他时机重新调用来解决。
    81             int errorCode = intent.getIntExtra(PushConstants.EXTRA_ERROR_CODE,
    82                     PushConstants.ERROR_SUCCESS);
    83             String content = "";
    84             if (intent.getByteArrayExtra(PushConstants.EXTRA_CONTENT) != null) {
    85                 // 返回内容
    86                 content = new String(
    87                         intent.getByteArrayExtra(PushConstants.EXTRA_CONTENT));
    88             }
    89 
    90             // 用户在此自定义处理消息,以下代码为demo界面展示用
    91             Log.d(TAG, "onMessage: method : " + method);
    92             Log.d(TAG, "onMessage: result : " + errorCode);
    93             Log.d(TAG, "onMessage: content : " + content);
    94 
    95         }
    96     }
    97 
    98     
    99 }
    PushMessageReceiver

    这个方法是百度官方实现好的,在这里只需要更具自己的需要来进行修改就好,在我的demo中使用的是百度云推送中的消息的方法,它还提供了通知的富媒体的方法,大家可以根据自己的需要选用

    在这里上一下我的Mainfest文件吧

      1 <?xml version="1.0" encoding="utf-8"?>
      2 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
      3     package="haha.haha"
      4     android:versionCode="1"
      5     android:versionName="1.0" >
      6 
      7     <uses-sdk
      8         android:minSdkVersion="7"
      9         android:targetSdkVersion="15" />
     10     <!-- Push service 运行需要的权限 -->
     11     <uses-permission android:name="android.permission.INTERNET" />
     12     <uses-permission android:name="android.permission.READ_PHONE_STATE" />
     13     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
     14     <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
     15     <uses-permission android:name="android.permission.WRITE_SETTINGS" />
     16     <uses-permission android:name="android.permission.VIBRATE" />
     17 
     18     <!-- for log. -->
     19     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
     20     <uses-permission android:name="android.permission.ACCESS_DOWNLOAD_MANAGER" />
     21     <uses-permission android:name="android.permission.DOWNLOAD_WITHOUT_NOTIFICATION" />
     22     <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
     23     <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
     24     <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
     25     <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
     26 
     27     <application
     28         android:hardwareAccelerated="true"
     29         android:icon="@drawable/ic_launcher"
     30         android:label="@string/app_name" >
     31         <activity
     32             android:name="com.baidu.push.example.PushDemoActivity"
     33             android:configChanges="orientation|keyboardHidden"
     34             android:label="@string/app_name"
     35             android:launchMode="singleTask" >
     36             <intent-filter>
     37                 <action android:name="android.intent.action.MAIN" />
     38 
     39                 <category android:name="android.intent.category.LAUNCHER" />
     40             </intent-filter>
     41         </activity>
     42         <activity
     43             android:name="com.baidu.push.example.LoginActivity"
     44             android:configChanges="orientation|keyboardHidden"
     45             android:label="@string/login" >
     46         </activity>
     47         <activity
     48             android:name="com.baidu.push.example.CustomActivity"
     49             android:configChanges="orientation|keyboardHidden"
     50             android:label="Push_notification_test" >
     51         </activity>
     52 
     53         <!-- push service rich media display -->
     54         <activity
     55             android:name="com.baidu.android.pushservice.richmedia.MediaViewActivity"
     56             android:configChanges="orientation|keyboardHidden"
     57             android:label="MediaViewActivity" >
     58         </activity>
     59         <activity
     60             android:name="com.baidu.android.pushservice.richmedia.MediaListActivity"
     61             android:configChanges="orientation|keyboardHidden"
     62             android:label="MediaListActivity"
     63             android:launchMode="singleTask" >
     64         </activity>
     65 
     66         <!-- push service client -->
     67         <receiver android:name="com.baidu.push.example.PushMessageReceiver" >
     68             <intent-filter>
     69 
     70                 <!-- 接收push消息 -->
     71                 <action android:name="com.baidu.android.pushservice.action.MESSAGE" />
     72                 <!-- 接收bind,unbind,fetch,delete等反馈消息 -->
     73                 <action android:name="com.baidu.android.pushservice.action.RECEIVE" />
     74                 <action android:name="com.baidu.android.pushservice.action.notification.CLICK" />
     75             </intent-filter>
     76         </receiver>
     77 
     78         <!-- push service -->
     79         <receiver
     80             android:name="com.baidu.android.pushservice.PushServiceReceiver"
     81             android:process=":bdservice_v1" >
     82             <intent-filter>
     83                 <action android:name="android.intent.action.BOOT_COMPLETED" />
     84                 <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
     85                 <action android:name="com.baidu.android.pushservice.action.notification.SHOW" />
     86                 <action android:name="com.baidu.android.pushservice.action.media.CLICK" />
     87             </intent-filter>
     88         </receiver>
     89         <receiver
     90             android:name="com.baidu.android.pushservice.RegistrationReceiver"
     91             android:process=":bdservice_v1" >
     92             <intent-filter>
     93                 <action android:name="com.baidu.android.pushservice.action.METHOD" />
     94                 <action android:name="com.baidu.android.pushservice.action.BIND_SYNC" />
     95             </intent-filter>
     96             <intent-filter>
     97                 <action android:name="android.intent.action.PACKAGE_REMOVED" />
     98 
     99                 <data android:scheme="package" />
    100             </intent-filter>
    101         </receiver>
    102 
    103         <service
    104             android:name="com.baidu.android.pushservice.PushService"
    105             android:exported="true"
    106             android:process=":bdservice_v1" />
    107 
    108         <meta-data
    109             android:name="api_key"
    110             android:value="oa1jNy3gxNu8Rq0EtXSGdIU2" />
    111         <!-- push service end -->
    112         <activity
    113             android:name="com.baidu.push.example.Web_view"
    114             android:label="@string/title_activity_web_view" >
    115         </activity>
    116     </application>
    117 
    118 </manifest>
    Mainfest.xml

    如果照着写到这里,会发现,没有动态更新,只能每次重新加载,这个问题困扰了我好几天,在这里我才用了使用广播的方法来处理,在service中接收到消息之后,发送广播通过定义不同的action来决定把广播发送给就拿一个Activity是否使用状态栏通知

    我在PushMessageReceiver添加了如下的代码

     1 Intent intent1 = new Intent();
     2             Intent intent2 = new Intent();
     3             Intent intent3 = new Intent();
     4             intent1.setAction("android.myservice");
     5             intent2.setAction("com.talkmessage");
     6             intent3.setAction("com.newmessage");
     7             if (sp.getString("SSP", null).equals("0")) {
     8                 System.out.println("TAG!");
     9                 // context.sendBroadcast(intent1);
    10                 showNotification();
    11             } else if (sp.getString("SSP", null).equals("1")) {
    12                 System.out.println("TAG@");
    13                 context.sendBroadcast(intent1);
    14             } else if (sp.getString("SSP", null).equals(entity.getfromUser())) {
    15                 System.out.println("TAG#");
    16                 context.sendBroadcast(intent2);
    17             } else {
    18                 System.out.println("TAG$");
    19                 // context.sendBroadcast(intent3);
    20                 showNotification();
    21             }
     1 private void showNotification() {
     2 
     3         NotificationManager notificationManager = (NotificationManager) context
     4                 .getSystemService(android.content.Context.NOTIFICATION_SERVICE);
     5         Notification notification = new Notification(R.drawable.ic_launcher,
     6                 "来新消息了", System.currentTimeMillis());
     7         notification.flags = Notification.FLAG_AUTO_CANCEL;
     8         notification.defaults |= Notification.DEFAULT_VIBRATE;
     9         notification.defaults |= Notification.DEFAULT_LIGHTS;
    10         long[] vibrate = { 0, 100, 200, 300 };
    11         notification.vibrate = vibrate;
    12         PendingIntent contentIntent = PendingIntent.getActivity(context, 0,
    13                 new Intent(context, PushDemoActivity.class), 0);
    14         notification.setLatestEventInfo(context, "您有新消息", null, contentIntent);
    15         notificationManager.notify(NOTIFICATION_ID, notification);
    16     }

    同时,在两个ACtivity中注册了BroadcastReceiver、

     1 public static class MyReceiver extends BroadcastReceiver {
     2 
     3         @Override
     4         public void onReceive(Context context, Intent intent) {
     5 
     6             String action = intent.getAction();
     7 
     8             if (action.equals("android.myservice")) {
     9                 talk = new ArrayList<TalkListInfo>();
    10 
    11                 talk = help.findList(userid);
    12 
    13                 if (talk != null) {
    14                     for (TalkListInfo t : talk) {
    15 
    16                         map.put("name", t.getName());
    17                         map.put("time", t.getDate());
    18                         map.put("content", t.getItem());
    19                     }
    20                     adapter = new ListAdapter(context, talk);
    21                     list.setAdapter(adapter);
    22                 }
    23             } else if (action.equals("com.newmessage")) {
    24 
    25             }
    26         }
    27 
    28     }

    同时,在activity的重新唤醒等各个状态中添加了重新构造Adapter是Demo能够真正做到实时更新

    最后 我贴上我的代码的完整版本的下载地址吧

    http://download.csdn.net/detail/u011321878/7006113

  • 相关阅读:
    .NET开源项目
    关于微信号的校验
    java 中关于synchronized的通常用法
    关于java 定时器的使用总结
    新的博客已经启用,欢迎大家访问(402v.com)
    Hadoop综合大作业
    hive基本操作与应用
    理解MapReduce计算构架
    熟悉HBase基本操作
    第三章 熟悉常用的HDFS操作
  • 原文地址:https://www.cnblogs.com/cwr941012/p/3586551.html
Copyright © 2020-2023  润新知