notification

Notification使用详解之三:通过服务更新进度通知&在Activity中监听服务进度

核能气质少年 提交于 2019-12-02 21:59:53
上次我们讲到如何实现一个可更新的进度通知,实现的方式是启动一个线程模拟一个下载任务,然后根据任务进度向UI线程消息队列发送进度消息,UI线 程根据进度消息更新通知的UI界面。可是在实际应用中,我们一般会将上传、下载等比较耗时的后台任务以服务的形式运行,更新进度通知也是交由后台服务来完 成的。 不过有的时候,除了在通知里面显示进度信息,我们也要在Activity中显示当前进度,很多下载系统都有这样的功能,例如Android自带浏览器的下 载系统、QQ浏览器的下载系统等等。那么如何实现这一功能呢?实现方式有很多,我们今天先来介绍其中的一种:在Activity中主动监听服务的进度。 具体的思路是:让Activity与后台服务绑定,通过中间对象Binder的实例操作后台服务,获取进度信息和服务的状态以及在必要的时候停止服务。 关于服务的生命周期,如果有些朋友们不太熟悉的话,可以去查阅相关资料;如果以后有时间,我可能也会总结一些与服务相关的知识。 为了让大家对这个过程更清晰一些,在上代码之前,我们先来看看几个截图: 整个过程如上图所示:在我们点击开始按钮后,下载任务开始运行,同事更新通知上的进度,当前Activity也从后台服务获取进度信息,显示到按钮下方;当我们点击通知后,跳转到下载管理界面,在这里我们也从后台服务获取进度,还可以做取消任务等操作。 了解了整个过程的情况后

Android 轮询最佳实践 Service + AlarmManager+Thread

一曲冷凌霜 提交于 2019-12-02 21:39:30
android中涉及到将服务器中数据变化信息通知用户一般有两种办法, 推送 和 轮询 。 消息推送是服务端主动发消息给客户端,因为第一时间知道数据发生变化的是服务器自己,所以推送的优势是实时性高。但服务器主动推送需要单独开发一套能让客户端持久连接的服务端程序,不过现在已经有很多开源的代码实现了基于xmmp协议的推送方案,而且还可以使用谷歌的推送方案。但有些情况下并不需要服务端主动推送,而是在一定的时间间隔内客户端主动发起查询。 譬如有这样一个app,实时性要求不高,每天只要能获取10次最新数据就能满足要求了,这种情况显然轮询更适合一些,推送显得太浪费,而且更耗电。 但是不管是轮询还是推送都需要 无论应用程序是否正在运行或者关闭 的情况下能给用户发送通知,因此都需要用到service。我们有两种方案来使用service达到此目的: 方案一:service + Thread 在service中开启一个带有while循环的线程,使其不断的从服务器查询数据(一定时间间隔内),当发现有需要通知用户的情况下发送notification。这种方案的代码大致是: import org.apache.http.Header; import org.json.JSONObject; import android.app.Notification; import android.app

我的Protobuf消息设计原则(续)--实践

和自甴很熟 提交于 2019-12-02 21:32:41
1.首先为 聊天服务器(Chat)定义google protobuf的协议接口文件 接口主要遵循 Request、Response、Notification(Indication),Command(本文未出现)四大消息分类,并且使用Message顶层消息把Request、Response,Notification等包含起来;并定义一个MSG枚举值,用于表示具体的消息值(在google protobuf RPC过程中,其实 每个service方法就是一个Request和Response的应答对,只不过其消息值的编码是RPC自动分配的) package chat; //定义protobuf的包名称空间,对应C++,C#的nanmespace,Java的package enum MSG { Login_Request = 10001; Login_Response = 10002; Logout_Request = 10003; Logout_Response = 10004; Keepalive_Request = 10005; Keepalive_Response = 10006; Get_Friends_Request = 10007; Get_Friends_Response = 10008; Send_Message_Request = 10009; Send_Message

扩展用户体验-Dialog,Toast,Notification

╄→尐↘猪︶ㄣ 提交于 2019-12-02 08:14:03
创建一个Dialog对话框 实例化一个Dialog实例,设置标题和布局,分别使用setTitle和setContentView。 例子: // Create the new Dialog. Dialog dialog = new Dialog(MyActivity.this); // Set the title. dialog.setTitle(“Dialog Title”); // Inflate the layout. dialog.setContentView(R.layout.dialog_view); // Update the Dialog’s contents. TextView text = (TextView)dialog.findViewById(R.id.dialog_text_view); text.setText(“This is the text in my dialog”); // Display the Dialog. dialog.show(); 使用AlertDialog类 去构建一个AlertDialog的UI,需要创建一个新的AlertDialog.Builder对象: AlertDialog.Builder ad = new AlertDialog.Builder(context); 你可以用此来设置标题、消息,还可以设置按钮,选择条目

pwa notification

孤街浪徒 提交于 2019-12-02 08:05:05
randomNotification(res) { let that = this; let games = { name:res.companyName, author:res.status.log, time:res.receiveTime, slug:’/assets/images/logo.png’ }; let notifTitle = games.name + ’ ’ + games.time; let notifBody = games.author+’.’; let notifImg = games.slug; let options = { body: notifBody, icon: notifImg } let notif = new Notification(notifTitle, options); notif.onclick = function(e){ e.preventDefault(); that.showCompanyDetail(res.companyCode) } }, toRandomNotification(){ let rtnData = []//根据上一个方法的games需求的字段随便设置点 let storageErrorData = []; for(let i in rtnData){ if(rtnData[i].status

Android Notification详解——响应notification事件

核能气质少年 提交于 2019-12-01 16:44:28
上一篇讲了如何创建并显示一个notification,这一篇就总结下点击notification后,程序应该如何响应。 一般来讲,点击一个notification后,都会打开一个Activity做为对点击事件的响应,这个Activity是之前在PendingIntent中设置好的。 经常玩Android手机的应该都有印象,在日历应用中,你新建一个提醒,当提醒通知收到后,你点击通知,会进入提醒的内容页面,如果这个时候按back键,会直接退出应用。 但是在Gmail的应用中,如果有一封新邮件到来,那么点击通知后,会进入到邮件的内容页面,等你看完邮件,点击back键,会退到邮件列表页面,再按back键,才会退出应用。 我们总结一下两种情况,假设我们的应用有两个Activity(ParentActivity、SubActivity),notification中设置打开的Activity为SubActivity。 那么第一种情况就是: 点击Notification ——> 进入SubActivity ——> back键 ——> 退出应用 第二种情况: 点击Notification ——> 进入SubActivity ——> back键 ——> 退到ParentActivity ——>back键 ——> 退出应用 第一种情况比较简单,只需要在PendingIntent中指定Activity

Notification使用详解之四:由后台服务向Activity发送进度信息

放肆的年华 提交于 2019-12-01 14:00:24
上次讲到了如何在Activity中监听后台服务的进度信息,实现的方式是让Activity与后台服务绑定,通过中间对象Binder的实例操作 后台服务。从效果上来讲,这种方式是可行的,不过这种实现有个缺点,那就是Activity的任务太重了,为了监听服务的状态,我们不得不绑定服务,然后 还需不断地定时的获取最新的进度,我们为何不换一下形式呢,让Service主动将进度发送给Activity,我们在Activity中只需拿到进度数 据,然后更新UI界面。这种新形式就像上次结尾提到的,就像两个男人同时喜欢一个女人,都通过自己的手段试图从那个女人那里获取爱情,现在我们要让那个女 人变为主动方,将爱情同时传递给那两个男人。 要实现以上方式,我们需要用到BroadcastReceiver,如果不太了解的朋友们,可以查阅相关资料补充一下。 关于整个流程的的截图,我在这里就不在贴出了,大家可以参看 Notification详解之三 的流程截图。布局文件也没有变化,所以这里也不在贴出。 我们主要看一下MainActivity、DownloadService、FileMgrActivity这几个组件的实现形式。 首先是MainActivity: [java] view plain copy package com.scott.notification; import android.app

Andriod经典之作(你必须知道 Service 用法)

。_饼干妹妹 提交于 2019-12-01 10:53:01
1、Service的种类 按运行地点分类: 应用本地服务(Local)远程服务(Remote) 应用本地服务(Local) 1) 区别:该服务依附在主进程上, 2) 优点:服务依附在主进程上而不是独立的进程,这样在一定程度上节约了资源,另外Local服务因为是在同一进程因此不需要IPC,也不需要AIDL。相应bindService会方便很多。 3) 缺点:主进程被Kill后,服务便会终止。 4) 应用:非常常见的应用如:HTC的音乐播放服务,天天动听音乐播放服务。 远程服务(Remote) 1) 区别:该服务是独立的进程, 2) 优点:服务为独立的进程,对应进程名格式为所在包名加上你指定的android:process字符串。由于是独立的进程,因此在Activity所在进程被Kill的时候,该服务依然在运行,不受其他进程影响,有利于为多个进程提供服务具有较高的灵活性。 3) 缺点:该服务是独立的进程,会占用一定资源,并且使用AIDL进行IPC稍微麻烦一点。 4) 应用:一些提供系统服务的Service,这种Service是常驻的。 其实remote服务还是很少见的,并且一般都是系统服务。 按运行类型分类: 前台服务后台服务 前台服务 1)会在通知一栏显示 ONGOING 的 Notification, 2)当服务被终止的时候,通知一栏的 Notification 也会消失

Android中pendingIntent的深入理解

穿精又带淫゛_ 提交于 2019-11-30 11:34:53
pendingIntent字面意义:等待的,未决定的Intent。 要得到一个pendingIntent对象,使用方法类的静态方法 getActivity(Context, int, Intent, int) , getBroadcast(Context, int, Intent, int) , getService(Context, int, Intent, int) 分别对应着Intent的3个行为,跳转到一个activity组件、打开一个广播组件和打开一个服务组件。 参数有4个,比较重要的事第三个和第一个,其次是第四个和第二个。可以看到,要得到这个对象,必须传入一个Intent作为参数,必须有context作为参数。 pendingIntent是一种特殊的Intent。主要的区别在于Intent的执行立刻的,而pendingIntent的执行不是立刻的。pendingIntent执行的操作实质上是参数传进来的Intent的操作,但是使用pendingIntent的目的在于它所包含的Intent的操作的执行是需要满足某些条件的。 主要的使用的地方和例子:通知 Notificatio的发送,短消息 SmsManager 的发送和警报器AlarmManager的执行等等。 Android 的状态栏通知 (Notification) 如果需要查看消息

PendingIntent

与世无争的帅哥 提交于 2019-11-30 08:46:50
PendingIntent可以看作是对Intent的一个封装,但它不是立刻执行某个行为, 而是满足某些条件或触发某些事件后才执行指定的行为。 PendingIntent的获取 PendingIntent获取有三种方式:通过Activity,Service,BroadcastReceiver获取. 1. 你可以通过 getActivity(Context context, int requestCode, Intent intent, int flags) 系列方法从系统 取得一个用于启动一个Activity的PendingIntent对象. 2.可以通过 getService(Context context, int requestCode, Intent intent, int flags) 方法从系统取得一个 用于启动一个Service的PendingIntent对象. 3.可以通过 getBroadcast(Context context, int requestCode, Intent intent, int flags) 方法从系统取得一个用于向BroadcastReceiver的发送广播的PendingIntent对象. PendingIntent的参数说明 拿第三种方式,广播的形式说明下 PendingIntent sentIntent = PendingIntent