在很多时候,都需要给控件设置一个未读消息提示,前段时间在工作中遇到了一个问题,有时候我们通过布局的方式不能实现这宗效果,但是BadgeView却可以实现。
我是通过一个广播加上一个服务实现了这种效果,可以动态的更新当前未读消息提示的数据。
使用BadgeView需要导入一个badgeview.jar包
首先是广播的注册:
MybroadcastTest broad = new MybroadcastTest();
IntentFilter filter = new IntentFilter();
filter.addAction("com.sendbradcase");
getActivity().registerReceiver(broad, filter);
Intent intent = new Intent(getActivity(),MyHintService.class);
getActivity().startService(intent);
然后是广播的接收:
class MybroadcastTest extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
String value = intent.getExtras().getString("value");
try {
JSONObject obj = new JSONObject(value);
JSONObject resultObj = obj.getJSONObject("RESULT");
// String at = resultObj.getString("at");
String at = JsonUtils.getJSONString(resultObj,"at" );
// String dynamic = resultObj.getString("microblog");
String dynamic = JsonUtils.getJSONString(resultObj, "microblog");
if(dynamic!=null){
if(!dynamic.equals("0")){
int num = Integer.parseInt(dynamic);
badgeView_left.setBadgeCount(num);
badgeView_left.setVisibility(View.VISIBLE);
Log.e("tag", "broadcast="+dynamic);
}else{
badgeView_left.setVisibility(View.GONE);
}
}
if(at!=null){
if(!at.equals("0")){
int num = Integer.parseInt(at);
badgeView_right.setBadgeCount(num);
badgeView_right.setVisibility(View.VISIBLE);
Log.e("tag", "broadcast="+at);
}else{
badgeView_right.setVisibility(View.GONE);
}
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
然后是在固定的位置设置未读消息的提示
WindowManager wm = (WindowManager) getActivity().getSystemService(Context.WINDOW_SERVICE);
int width = wm.getDefaultDisplay().getWidth();
badgeView_left = new BadgeView(getActivity());
badgeView_left.setTargetView(tabHost); //提示是显示在哪个控件上面
badgeView_left.setBadgeCount(0); //初始未读消息的条数
// badgeView_left.setBadgeMargin(10);
badgeView_left.setBadgeMargin(width/8+18,8, 0, 0);
badgeView_left.setBackgroundResource(R.drawable.count_bg); //未读消息的背景图片
badgeView_left.setBadgeGravity(Gravity.TOP | Gravity.LEFT);
badgeView_left.setVisibility(View.GONE);
然后是在service实时请求数据
package com.northdoo.service;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import com.northdoo.workcircle.Config;
import android.annotation.SuppressLint;
import android.app.ActivityManager;
import android.app.ActivityManager.RunningAppProcessInfo;
import android.app.Service;
import android.app.ActivityManager.RunningTaskInfo;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.os.IBinder;
import android.util.Log;
public class MyHintService extends Service {
String tag = "TAG";
String userid ;
MyThread thread ;
int i = 0;
boolean sessionflag = true;
public String loginbegin;
SharedPreferences sp ;
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
sp = this.getSharedPreferences(Config.FILE, MODE_APPEND);
thread = new MyThread();
thread.start();
return super.onStartCommand(intent, flags, startId);
}
//这个线程中的判断是我根据我那个项目的需求写的。
public class MyThread extends Thread{
public void run() {
while(sessionEffective()){//session没有过期
try {
if(!isBackground(getApplicationContext())){//如果是前台线程
String result = HttpService.getMessageTip();
if(result.contains("登录")){
}else{
Log.e("MyHintService", "MyHintService="+result+" "+sessionflag);
// if(!result.equals("0")){
Intent intent = new Intent();
intent.setAction("com.sendbradcase");
intent.putExtra("value", result);
sendBroadcast(intent);
// }
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
/**
* 判断session是否过期
* */
public boolean sessionEffective(){
loginbegin = sp.getString(Config.LOGIN_START_TIME, "0");
String current = getCurrentTime();
Log.e("tiem_string", "tiem_string="+current+" "+loginbegin);
long[] timedif = getDistanceTimes(loginbegin,current);
if(timedif[0]>=1 || timedif[1]>=4 ){
sessionflag = false;
}else {
sessionflag = true;
}
return sessionflag;
}
/**
* 获取当前的系统时间
* */
public String getCurrentTime(){
Date now = new Date();
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//可以方便地修改日期格式
String hehe = dateFormat.format( now );
System.out.println(hehe);
return hehe;
}
/**
* 计算两个时间的时间差
* @return long[] 返回值为:{天, 时, 分, 秒}
* */
@SuppressLint("SimpleDateFormat")
public static long[] getDistanceTimes(String str1, String str2) {
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date one;
Date two;
long day = 0;
long hour = 0;
long min = 0;
long sec = 0;
try {
one = df.parse(str1);
two = df.parse(str2);
long time1 = one.getTime();
long time2 = two.getTime();
long diff ;
if(time1<time2) {
diff = time2 - time1;
} else {
diff = time1 - time2;
}
day = diff / (24 * 60 * 60 * 1000);
hour = (diff / (60 * 60 * 1000) - day * 24);
min = ((diff / (60 * 1000)) - day * 24 * 60 - hour * 60);
sec = (diff/1000-day*24*60*60-hour*60*60-min*60);
} catch (ParseException e) {
e.printStackTrace();
}
long[] times = {day, hour, min, sec};
return times;
}
/**
*判断当前应用程序处于前台还是后台
*/
public static boolean isBackground(Context context) {
ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
List<RunningAppProcessInfo> appProcesses = activityManager.getRunningAppProcesses();
for (RunningAppProcessInfo appProcess : appProcesses) {
if (appProcess.processName.equals(context.getPackageName())) {
if (appProcess.importance == RunningAppProcessInfo.IMPORTANCE_BACKGROUND) {
// Log.i("后台", appProcess.processName);
return true;
}else{
// Log.i("前台", appProcess.processName);
return false;
}
}
}
return false;
}
@Override
public void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
thread.stop();
stopSelf();
thread.destroy();
}
}