Android设置未读消息提示,BadgeView

在很多时候,都需要给控件设置一个未读消息提示,前段时间在工作中遇到了一个问题,有时候我们通过布局的方式不能实现这宗效果,但是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();
}




}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值