我们在QQ项目中实现了通知栏后台运行,以及来新消息提示,通常在消息通知时,我们经常用到两个组件Toast和Notification。特别是重要的和需要长时间显示的信息,用Notification就最合适不过了。当有消息通知时,状态栏会显示通知的图标和文字,通过下拉状态栏,就可以看到通知信息了,Android这一创新性的UI组件赢得了用户的一致好评,就连苹果也开始模仿了。其实有点类似于Windows的托盘显示。
下面我们就来根据QQ小项目,来具体分析一下。先看下两张效果图:
一、通知栏的布局文件,在我们这个QQ小项目中,当我们在好友列表的Activity按返回键的时候,先作一个程序进入后台运行的标记(可以是全局变量,也可以保存到SharedPreferenced文件中),然后发送一个广播,我们通过在服务里接收这个广播,就马上初始化后台运行的通知栏的view,当新消息到来时,我们就不把消息通过广播发送出去了(因为没有Activity在运行),而是直接通过更新通知栏来提醒用户,同时发送一个通知(带声音、带振动)。下面是我们这个在通知栏的view的布局文件notify_view.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="2dp" >
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<ImageView
android:id="@+id/notify_imageLog"
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_alignParentLeft="true"
android:layout_centerVertical="true"
android:paddingLeft="5dp"
android:src="@drawable/h001" />
<TextView
android:id="@+id/notify_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_toRightOf="@+id/notify_imageLog"
android:paddingLeft="5dp"
android:text="name"
android:textColor="#000000"
android:textSize="20sp" />
</RelativeLayout>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:orientation="horizontal" >
<TextView
android:id="@+id/notify_msg"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:paddingLeft="15dp"
android:text="msg"
android:textColor="@color/black"
android:textSize="15sp" />
<TextView
android:id="@+id/notify_time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="right"
android:paddingRight="15dp"
android:text="time"
android:textColor="@color/black"
android:textSize="15sp" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
二、初始化通知栏view的方法,在GetMsgService中写一个方法,初始化我们这个通知栏的view:
/**
* 创建通知
*/
private void setMsgNotification() {
int icon = R.drawable.notify;
CharSequence tickerText = "";
long when = System.currentTimeMillis();
mNotification = new Notification(icon, tickerText, when);
// 放置在"正在运行"栏目中
mNotification.flags = Notification.FLAG_ONGOING_EVENT;
RemoteViews contentView = new RemoteViews(mContext.getPackageName(),
R.layout.notify_view);
contentView.setTextViewText(R.id.notify_name, util.getName());
contentView.setTextViewText(R.id.notify_msg, "手机QQ正在后台运行");
contentView.setTextViewText(R.id.notify_time, MyDate.getDate());
// 指定个性化视图
mNotification.contentView = contentView;
Intent intent = new Intent(this, FriendListActivity.class);
PendingIntent contentIntent = PendingIntent.getActivity(mContext, 0,
intent, PendingIntent.FLAG_UPDATE_CURRENT);
// 指定内容意图
mNotification.contentIntent = contentIntent;
mNotificationManager.notify(Constants.NOTIFY_ID, mNotification);
}
三,好友列表Activity返回按键的广播接收者,用户按返回键发送广播,并做好标记,程序进入后台运行:
// 收到用户按返回键发出的广播,就显示通知栏
private BroadcastReceiver backKeyReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
Toast.makeText(context, "QQ进入后台运行", 0).show();
setMsgNotification();
}
};
四,通过handler更新通知栏,我们是通过handler来处理消息并更新通知栏的:
// 用来更新通知栏消息的handler
private Handler handler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
case MSG:
int newMsgNum = application.getNewMsgNum();// 从全局变量中获取
newMsgNum++;// 每收到一次消息,自增一次
application.setNewMsgNum(newMsgNum);// 再设置为全局变量
TranObject<TextMessage> textObject = (TranObject<TextMessage>) msg
.getData().getSerializable("msg");
// System.out.println(textObject);
if (textObject != null) {
int form = textObject.getFromUser();// 消息从哪里来
String content = textObject.getObject().getMessage();// 消息内容
ChatMsgEntity entity = new ChatMsgEntity("",
MyDate.getDateEN(), content, -1, true);// 收到的消息
messageDB.saveMsg(form, entity);// 保存到数据库
// 更新通知栏
int icon = R.drawable.notify_newmessage;
CharSequence tickerText = form + ":" + content;
long when = System.currentTimeMillis();
mNotification = new Notification(icon, tickerText, when);
mNotification.flags = Notification.FLAG_NO_CLEAR;
// 设置默认声音
mNotification.defaults |= Notification.DEFAULT_SOUND;
// 设定震动(需加VIBRATE权限)
mNotification.defaults |= Notification.DEFAULT_VIBRATE;
mNotification.contentView = null;
Intent intent = new Intent(mContext,
FriendListActivity.class);
PendingIntent contentIntent = PendingIntent.getActivity(
mContext, 0, intent, 0);
mNotification.setLatestEventInfo(mContext, util.getName()
+ " (" + newMsgNum + "条新消息)", content,
contentIntent);
}
mNotificationManager.notify(Constants.NOTIFY_ID, mNotification);// 通知一下才会生效哦
break;
default:
break;
}
}
};
四,监听消息,我们监听收消息线程中收到的消息先判断程序是否运行在后台,如果在后台,我们就直接把消息发送给handler,如果不是,就通过广播发送出去这个消息,所以:我们首先需要在按返回键的进入后台的时候,做一个标记,表示程序进入后台运行,我这里是通过保存在SharedPreferenced文件中的,其实可以保存到应用的全局变量:
in.setMessageListener(new MessageListener() {
@Override
public void Message(TranObject msg) {
// System.out.println("GetMsgService:" + msg);
if (util.getIsStart()) {// 如果 是在后台运行,就更新通知栏,否则就发送广播给Activity
if (msg.getType() == TranObjectType.MESSAGE) {// 只处理文本消息类型
// System.out.println("收到新消息");
// 把消息对象发送到handler去处理
Message message = handler.obtainMessage();
message.what = MSG;
message.getData().putSerializable("msg", msg);
handler.sendMessage(message);
}
} else {
Intent broadCast = new Intent();
broadCast.setAction(Constants.ACTION);
broadCast.putExtra(Constants.MSGKEY, msg);
sendBroadcast(broadCast);// 把收到的消息已广播的形式发送出去
}
}
});
后台消息处理就是这样实现的,如果大家有什么好的建议或者疑问,欢迎给我留言,谢谢。
分享到:
相关推荐
Android仿QQ消息通知栏新消息实时更新效果,实时接收新消息显示并更新,点击通知栏清除所有新消息
android NotificationListenerService 监听通知栏,android NotificationListenerService 监听通知栏 android NotificationListenerService 监听通知栏
Android 使用Notification自定义通知栏显示。自定义系统状态栏通知类NotificationExtend,也可以手动更新状态栏。依据此项目可以做成线程接受,或者广播接受自动更新。我博客网址: ...
支持音乐后台播放,通知栏播放暂停等。博客地址:https://blog.csdn.net/qq_37077360/article/details/80570684
各种样式的通知栏,以及不同版本的兼容性的版本,还有自定义的QQ悬浮窗通知栏以及前台服务类型的通知栏。
类似于QQ 微信等聊天或者下载App 状态栏提醒 可点击进入
当锁屏状态下收到通知,唤醒屏幕。主要思路为通过MyService服务发送一条广播,然后判断如果为锁屏状态就启动锁屏消息的activity.此时有震动和铃声提示,显示倒计时。博客地址为:...
适配Android 通知栏8.0 以及角标数字显示 如果想要qq 微信弹出效果,需要手动去开启通知悬浮效果就能看到,不能看到的卸载重新安装一下,因为8.0需要设置渠道
在QQ群里,很多朋友问如何实现android4.0的通知栏里面的listview滑动删除一个item的效果,我这里简单实现了一下,看图吧(一图胜千言)。 代码文章详情:http://blog.csdn.net/michael_yy/article/details/8031808
自己写的关于消息通知栏的demo,这个很简单了啊。新手看看还可以
android仿qq多级列表,是两层的,效果还不错!
4、通知栏提醒,实现仿QQ音乐播放器的通知栏功能. 涉及的技术有: 1、jsoup解析网络网页,从而获取需要的数据 2、android中访问网络,获取文件到本地的网络请求技术,以及下载文件到本地实现断点下载 3、线程池 4、...
支持Android 5.0+ 支持在线歌曲下载 歌词播放、桌面歌词、桌面小控件 通知栏控制、线控播放、音频焦点控制 QQ登录、在线歌单同步 百度电台列表,网易云mv排行榜,mv播放评论 酷狗歌词搜索、修改歌词样式
就是手机的通知栏的颜色不再是白色、黑色简单的两种了,本人用的小米4手机,米4手机中的自带软件都支持沉浸式通知栏, 举个例子:大家可以看一下自己的qq,它的标题的背景颜色是蓝色的,那么通知栏也会变成蓝色。...
十一、提供两种模式的版本更新,一种是对话框显示下载进度,一种是通知栏显示后台默默下载形式 github:https://github.com/MZCretin/AutoUpdateProject 注:本文为转载作品,观看原文请移步github网址。
AccessibilityTest Android辅助功能测试,实现自动打开通知栏的特定联系人的QQ消息,并打开会话页面 可扩展的功能还是很多的,例如在没有root权限的情况下实现静默安装
扫码加入QQ群(群号:828385813)目录效果图功能介绍支持AndroidX支持后台下载支持强制更新支持自定义下载过程支持设备> = Android M动态权限的申请支持通知栏进度条展示(或者自定义显示进度)支持Android N支持...
主要介绍了Android实现类似qq微信消息悬浮窗通知,需要的朋友可以参考下
这个一个将项目缩小到通知栏以及如何恢复的实例demo。里面的方法比较精炼。希望对初学者有帮助。