实例介绍
【实例简介】
【实例截图】
【实例截图】
【核心代码】
package com.ty.winchat.ui;
import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Queue;
import java.util.Set;
import net.youmi.android.AdManager;
import net.youmi.android.banner.AdSize;
import net.youmi.android.banner.AdView;
import net.youmi.android.spot.SpotManager;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.ServiceConnection;
import android.content.SharedPreferences;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.location.Location;
import android.location.LocationManager;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.telephony.TelephonyManager;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.Button;
import android.widget.ExpandableListView;
import android.widget.ExpandableListView.OnChildClickListener;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.ty.winchat.R;
import com.ty.winchat.WinChatApplication;
import com.ty.winchat.listener.Listener;
import com.ty.winchat.listener.TCPFileListener;
import com.ty.winchat.listener.inter.IconReceived;
import com.ty.winchat.model.UDPMessage;
import com.ty.winchat.model.User;
import com.ty.winchat.service.ChatService;
import com.ty.winchat.service.ChatService.MyBinder;
import com.ty.winchat.util.Constant;
import com.ty.winchat.util.LocalMemoryCache;
import com.ty.winchat.util.Util;
import com.ty.winchat.widget.PullToRefreshExpandableListView;
import com.ty.winchat.widget.PullToRefreshExpandableListView.OnRefreshListener;
public class Main extends Base implements IconReceived{
private PullToRefreshExpandableListView listView;
private List<User> users=new ArrayList<User>();
private Map<String, Queue<UDPMessage>> messages;
MyServiceConnection connection;
public static MyBinder binder;
private boolean binded;
private MyAdapter adapter;
private UserBroadcastReceiver receiver=new UserBroadcastReceiver();
private Map<String, Message> iconMap=new HashMap<String, Message>();
public static final String ACTION_ADD_USER="com.ty.winchat.adduser";
private TCPFileListener fileListener;
private Handler handler=new Handler(){
public void handleMessage(Message msg) {
try {
//刷新头像
((ImageView)msg.obj).setImageBitmap(Util.getRoundedCornerBitmap(LocalMemoryCache.getInstance().get(msg.getData().getString("key"))));
} catch (Exception e) {
e.printStackTrace();
}
};
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
init();
fileListener=TCPFileListener.getInstance();
if(!fileListener.isRunning()) {
try {
fileListener.open();
fileListener.setIconReceived(this);
} catch (IOException e) {
e.printStackTrace();
}
}
// 加载插播资源
SpotManager.getInstance(this).loadSpotAds();
my();
}
private void my(){
}
@Override
protected void onStart() {
super.onStart();
// SpotManager.getInstance(this).showSpotAds(this);
// SpotManager.getInstance(this).getSpotDialog();
listView.setAdapter(adapter=new MyAdapter());
adapter.notifyDataSetChanged();
if(fileListener!=null)
fileListener.setOnProgressUpdate(null);
}
/**
* 做一些初始化的动作
*/
private void init(){
Intent intent=new Intent(Main.this,ChatService.class);
startService(intent);
bindService(intent, connection=new MyServiceConnection(), Context.BIND_AUTO_CREATE);
IntentFilter filter=new IntentFilter(ACTION_ADD_USER);
registerReceiver(receiver, filter);
listView=(PullToRefreshExpandableListView) findViewById(R.id.main_listview);
TextView view=(TextView) findViewById(R.id.toptextView);
Button set=(Button) findViewById(R.id.right_btn);
view.setText("Wifi-Chat");
set.setText("设置");
set.setVisibility(View.VISIBLE);
set.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(Main.this,com.ty.winchat.ui.Set.class));
}
});
listView.setGroupIndicator(getResources().getDrawable(R.drawable.listview_open_selector));
listView.setOnChildClickListener(new OnChildClickListener() {
@Override
public boolean onChildClick(ExpandableListView parent, View v,
int groupPosition, int childPosition, long id) {
if(binded){
unbindService(connection);
binded=false;
}
Intent intent=new Intent(Main.this,MessageChat.class );
switch (groupPosition) {
case 0:
String ip=WinChatApplication.mainInstance.getLocalIp();
if(ip==null){
showToast("请检测wifi");
return false;
}
intent.putExtra("IP",ip);
intent.putExtra("DeviceCode", WinChatApplication.mainInstance.getDeviceCode());
intent.putExtra("name", WinChatApplication.mainInstance.getMyName());
break;
case 1:
User user=users.get(childPosition);
intent.putExtra("IP",user .getIp());
intent.putExtra("DeviceCode", user.getDeviceCode());
intent.putExtra("name", user.getUserName());
break;
case 2:
intent=new Intent(Main.this,RoomChat.class );
}
startActivity(intent);//跳转到个人聊天界面
return false;
}
});
listView.setOnRefreshListener(new OnRefreshListener() {
@Override
public void onRefresh() {
new AsyncTask<Void, Void, Void>() {
protected Void doInBackground(Void... params) {
try {
if(binder!=null)
binder.noticeOnline();
Thread.sleep(300);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void result) {
listView.onRefreshComplete();
}
}.execute();
}
});
initad();
}
/**
* 初始化广告
*/
private void initad(){
AdManager.getInstance(this).init(Constant.id,Constant.key, false);
LinearLayout adLayout = (LinearLayout) findViewById(R.id.adLayout);
AdView adView = new AdView(this, AdSize.SIZE_320x50);
adLayout.addView(adView);
}
long oldTime;
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if(keyCode==KeyEvent.KEYCODE_BACK){
long currentTime=System.currentTimeMillis();
if(currentTime-oldTime<3*1000){
finish();
}else{
showToast("再按一次退出");
oldTime=currentTime;
}
}
return true;
}
@Override
protected void onDestroy() {
super.onDestroy();
if(binded)
unbindService(connection);
stopService(new Intent(Main.this,ChatService.class));
unregisterReceiver(receiver);
if(fileListener!=null)
try {
fileListener.close();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 用来通知刷新列表
*/
class UserBroadcastReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
if(binder!=null){
users.clear();
Set<Entry<String,User>> set=binder.getUsers().entrySet();
for(Entry<String,User> entry:set)
users.add(entry.getValue());
if(adapter==null) {
adapter=new MyAdapter();
listView.setAdapter(adapter);
}
adapter.notifyDataSetChanged();
}else {
unbindService(connection);
binded=false;
bindService(new Intent(Main.this,ChatService.class), connection=new MyServiceConnection(), Context.BIND_AUTO_CREATE);
}
}
}
public class MyServiceConnection implements ServiceConnection{
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
binder=(MyBinder) service;
messages=binder.getMessages();
binded=true;
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
}
class MyAdapter extends BaseExpandableListAdapter{
String[] group={"自己","在线","聊天室"};
@Override
public Object getChild(int arg0, int arg1) {
return null;
}
@Override
public long getChildId(int groupPosition, int childPosition) {
return 0;
}
@Override
public View getChildView(int groupPosition, int childPosition,
boolean isLastChild, View convertView, ViewGroup parent) {
ViewHolder holder;
if(convertView==null){
holder=new ViewHolder();
convertView=getLayoutInflater().inflate(R.layout.main_listview_child_item, null);
holder.userName=(TextView) convertView.findViewById(R.id.main_listview_child_item_name);
holder.ip=(TextView) convertView.findViewById(R.id.main_listview_child_item_ip);
holder.msgNum=(TextView) convertView.findViewById(R.id.main_listview_child_item_msg_num);
holder.icon=(ImageView) convertView.findViewById(R.id.main_listview_child_item_icon);
convertView.setTag(holder);
}else {
holder=(ViewHolder) convertView.getTag();
}
switch (groupPosition) {
case 0://自己
holder.userName.setText(WinChatApplication.mainInstance.getMyName());
holder.ip.setText(WinChatApplication.mainInstance.getLocalIp());
holder.msgNum.setVisibility(View.INVISIBLE);
Bitmap bitmap=LocalMemoryCache.getInstance().get(com.ty.winchat.ui.Set.iconName);
if(bitmap==null){
bitmap=BitmapFactory.decodeFile(WinChatApplication.iconPath com.ty.winchat.ui.Set.iconName);
if(bitmap!=null){
holder.icon.setImageBitmap(Util.getRoundedCornerBitmap(bitmap));
LocalMemoryCache.getInstance().put(com.ty.winchat.ui.Set.iconName, bitmap);
}else {
holder.icon.setImageResource(R.drawable.ic_launcher);
}
}else{
holder.icon.setImageBitmap(Util.getRoundedCornerBitmap(bitmap));
}
break;
case 1://在线
User user=users.get(childPosition);
holder.userName.setText(user.getUserName());
holder.ip.setText(user.getIp());
Queue<UDPMessage> msgs=messages.get(user.getIp());
if(msgs!=null&&msgs.size()>0){
holder.msgNum.setVisibility(View.VISIBLE);
holder.msgNum.setText(msgs.size() "");
}else {
holder.msgNum.setVisibility(View.INVISIBLE);
}
Bitmap bitmap1=LocalMemoryCache.getInstance().get(user.getDeviceCode());//用设备id来标识唯一头像
if(bitmap1==null){//内存中没有
bitmap1=BitmapFactory.decodeFile(WinChatApplication.iconPath user.getDeviceCode());//从硬盘上获取
if(bitmap1!=null){
holder.icon.setImageBitmap(Util.getRoundedCornerBitmap(bitmap1));
LocalMemoryCache.getInstance().put(user.getDeviceCode(), bitmap1);//放进缓存
if(!user.isRefreshIcon()){//第一次展示则再次请求刷新
reFreashIcon(user, holder.icon);
}
}else {//磁盘也没有,则发送消息获取
holder.icon.setImageResource(R.drawable.ic_launcher);
reFreashIcon(user, holder.icon);
}
}else {
holder.icon.setImageBitmap(Util.getRoundedCornerBitmap(bitmap1));
if(!user.isRefreshIcon()){//第一次展示则再次请求刷新
reFreashIcon(user, holder.icon);
}
}
break;
case 2://聊天室
Bitmap bitmap2=BitmapFactory.decodeResource(getResources(), R.drawable.all_people_icon);
holder.icon.setImageBitmap(Util.getRoundedCornerBitmap(bitmap2));
holder.userName.setText("所有");
holder.ip.setText("接收所有在线人消息");
msgs=messages.get(Constant.ALL_ADDRESS);
if(msgs!=null&&msgs.size()>0){
holder.msgNum.setVisibility(View.VISIBLE);
holder.msgNum.setText(msgs.size() "");
}else {
holder.msgNum.setVisibility(View.INVISIBLE);
}
break;
}
return convertView;
}
/**
* 请求图片
* @param user
* @param view
*/
private void reFreashIcon(User user,ImageView view){
if(binder!=null)
try {
UDPMessage message=WinChatApplication.mainInstance.getMyUdpMessage("", Listener.REQUIRE_ICON);
binder.sendMsg(message, InetAddress.getByName(user.getIp()));
Message msg=handler.obtainMessage();
msg.obj=view;
iconMap.put(user.getDeviceCode(), msg);//记录当前位置的ImageView对象
user.setRefreshIcon(true);
} catch (UnknownHostException e) {
e.printStackTrace();
}
}
@Override
public int getChildrenCount(int groupPosition) {
switch (groupPosition) {
case 0:
return 1;
case 1:
return users.size();
case 2:
return 1;
}
return 0;
}
@Override
public Object getGroup(int groupPosition) {
return null;
}
@Override
public int getGroupCount() {
return group.length;
}
@Override
public long getGroupId(int groupPosition) {
return 0;
}
@Override
public View getGroupView(int groupPosition, boolean isExpanded,
View convertView, ViewGroup parent) {
ViewHolder holder;
if(convertView==null){
holder=new ViewHolder();
convertView=getLayoutInflater().inflate(R.layout.main_listview_group_item, null);
holder.userName=(TextView) convertView.findViewById(R.id.txt);
holder.ip=(TextView) convertView.findViewById(R.id.num);
convertView.setTag(holder);
}else {
holder=(ViewHolder) convertView.getTag();
}
holder.userName.setText(group[groupPosition]);
if(groupPosition==0){
holder.ip.setText("[1]");
}else if(groupPosition==1){
holder.ip.setText("[" users.size() "]");
}else if(groupPosition==2){
holder.ip.setText("[1]");
}
return convertView;
}
@Override
public boolean hasStableIds() {
return false;
}
@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
return true;
}
}
class ViewHolder{
TextView userName;
TextView ip;
TextView msgNum;
ImageView icon;
}
@Override
public void iconReceived(String fileName) {
Message msg=iconMap.get(fileName);
if(msg!=null){
Bitmap bitmap=BitmapFactory.decodeFile(WinChatApplication.iconPath fileName);
if(bitmap!=null){
LocalMemoryCache.getInstance().put(fileName, bitmap);
Bundle bundle=new Bundle();
bundle.putString("key", fileName);
msg.setData(bundle);
handler.sendMessage(msg);
}
}
}
}
好例子网口号:伸出你的我的手 — 分享!
网友评论
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明


支持(0) 盖楼(回复)
支持(0) 盖楼(回复)
支持(0) 盖楼(回复)
支持(0) 盖楼(回复)