Android之RemoteView
android 中的RemoteView添加点击操作,是通过延迟意图PentingIntent来执行的.
应用场景: 通知栏与桌面小部件,更新不同进程间的界面
桌面部件与通知栏分别由AppWidgetManager 与 NotificationManager来管理.
分别与systemService进程中的AppWidgetServer和NotificationManagerServer进行通讯
所以,才需要RemoteView来更新界面.RemoteView实现了Paracelable,通过Bindler传递到
systemService进程中.
通知栏:
1.现在清单文件中做如下配置
<!-- appwidget的receiver --><receiver android:name="com.wmh.mobilesafe.receiver.AppWidgetProvider" ><intent-filter><action android:name="android.appwidget.action.APPWIDGET_UPDATE" /></intent-filter><meta-dataandroid:name="android.appwidget.provider"android:resource="@xml/appwidget_info" /></receiver>
2.配置@xml/appwidget_info文件,xml文件夹是res文件夹的子文件夹
2.1 先介绍各个属性的含义
<!-- <appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
android:minWidth="294dp"
android:minHeight="72dp"//能被调整的最小宽高,若大于minWidth minHeight 则忽略
android:updatePeriodMillis="86400000"//更新周期,毫秒,最短默认半小时
android:previewImage="@drawable/preview"//选择部件时 展示的图像,3.0以上使用,默认是ic_launcher
android:initialLayout="@layout/example_appwidget"//布局文件
android:configure="com.example.android.ExampleAppWidgetConfigure"//添加widget之前,先跳转到配置的activity进行相关参数配置
android:resizeMode="horizontal|vertical"//widget可以被拉伸的方向。horizontal表示可以水平拉伸,vertical表示可以竖直拉伸
android:widgetCategory="home_screen|keyguard"//分别在屏幕主页和锁屏状态也能显示(4.2+系统才支持)
android:initialKeyguardLayout="@layout/example_keyguard"//锁屏状态显示的样式(4.2+系统才支持)
>
</appwidget-provider> -->
2.2下面是我的配置
<?xml version="1.0" encoding="UTF-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"android:minWidth="294dp"android:minHeight="72dp"android:initialLayout="@layout/process_widget">
</appwidget-provider>
3.配置广播接收者
public class AppWidgetProvider extends android.appwidget.AppWidgetProvider{/**1.onEnabled 创建第一个窗体小部件的方法的时候调用*2.onUpdate 创建多一个窗体小部件的方法*3.onAppWidgetOptionsChanged 当窗体小部件的宽高方式改变的时候调用,创建的时候也调用*4.onDeleted 删除小部件调用的方法*5.onDisabled 删除最后一个窗体小部件调用的方法*/@Overridepublic void onReceive(Context context, Intent intent) {super.onReceive(context, intent);}//创建第一个窗体小部件的方法@Overridepublic void onEnabled(Context context) {super.onEnabled(context);//开启服务context.startService(new Intent(context,UpdateWidgetService.class));}//删除最后一个窗体小部件调用的方法@Overridepublic void onDisabled(Context context) {super.onDisabled(context);//关闭服务}
}
4.配置服务,用来实时更新窗体小部件
public class UpdateWidgetService extends Service {private Timer timer;private TimerTask task;@Overridepublic IBinder onBind(Intent intent) {return null;}@Overridepublic void onCreate() {super.onCreate();// 管理进程总数和可用内存数的更新startTimer();}private void startTimer() {timer = new Timer();task = new TimerTask() {@Overridepublic void run() {// UI定时更新UpdateAppWidget();}};timer.scheduleAtFixedRate(task, 0, 2000);// 比schedule要好}protected void UpdateAppWidget() {// 1.获取APPwidget的对象AppWidgetManager aWM = AppWidgetManager.getInstance(this);// 2.获取窗体小部件的布局转化成的ViewRemoteViews view = new RemoteViews(getPackageName(), R.layout.process_widget);// 3.给窗体小部件view对象,内部空间赋值view.setTextViewText(R.id.tv_process_count,"进程数:" + ProcessInfoProvider.getProcessCount(getApplicationContext()));String availMemory = Formatter.formatFileSize(getApplicationContext(),ProcessInfoProvider.getAvailMemory(getApplicationContext()));view.setTextViewText(R.id.tv_process_memory, "可用内存:" + availMemory);// 设置点击事件进入应用 PendingIntent延期的意图Intent intent1 = new Intent();intent1.setAction("android.intent.action.splash");intent1.addCategory("android.intent.category.DEFAULT");// FLAG_CANCEL_CURRENT 点了就消失PendingIntent pendingIntent1 = PendingIntent.getActivity(this, 0, intent1, PendingIntent.FLAG_CANCEL_CURRENT);view.setOnClickPendingIntent(R.id.ll_widget_root, pendingIntent1);//通过延期意图发送广播,在广播接收者中杀死进程Intent broadCastIntent = new Intent("android.intent.action.KILL_BACKGROUND_PROCESS");PendingIntent pendingIntent2 = PendingIntent.getBroadcast(getApplicationContext(), 0, broadCastIntent, PendingIntent.FLAG_CANCEL_CURRENT);view.setOnClickPendingIntent(R.id.bt_clear, pendingIntent2);// 更新的操作 后面的参数是窗体小部件对应的的广播接收者 attention:这一步写在最后边ComponentName componentName = new ComponentName(getApplicationContext(), AppWidgetProvider.class);aWM.updateAppWidget(componentName, view);}@Overridepublic void onDestroy() {super.onDestroy();if (timer != null && task != null) {timer.cancel();task.cancel();}}}
5.配置清理进程的广播接收者
public class killBackGroundReicever extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {//接收广播,清理进程ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);List<RunningAppProcessInfo> runningAppProcesses = am.getRunningAppProcesses();for (RunningAppProcessInfo runningAppProcessInfo : runningAppProcesses) {am.killBackgroundProcesses(runningAppProcessInfo.processName);}}}
Android之RemoteView相关推荐
- Android AppWidget RemoteView
坑: AndroidMenifest.xml中一定要声明permission <?xml version="1.0" encoding="utf-8"?& ...
- android实现自动取消订单,android – 使用RemoteView自动取消自定义通知
我实现这一目标的方法是创建BroadcastReceiver,它控制来自Notification的按钮点击.创建这样的东西: public class NotificationButtonListen ...
- 异常分析 (空间太小)
出现 异常的原因: 碎片化 . MobileAPI脏数据 混淆时没有Keep 要使用的类或者方法 . 本地开发要与线上分开 异常信息中提示 "方法名"unknow ...
- Android App Widget中如何调用RemoteView中的函数
我们在开发App Widget时候,要创建一个RemoteView来呈现界面.但是会发现如果我们想要控制RemoteView中的view时候是无法使用findViewbyId来控制Child View ...
- Android中的remoteView
最近在学习中遇到了一个以前没有接触过的知识点remoteView,通过查阅资料,我发现了关于remoteView的一些相关特性. 1.RemoteView概述: 到目前为止,我发现RemoteView ...
- Android RemoteView的应用 一 桌面控件
这回通过RemoteView来制作一个能够接受点击事件的桌面控件. 1. 在res/layout 新建widget文件,这是设计桌面控件的界面 <?xml version="1.0&q ...
- remoteview android,android remoteView原理
android 中的remoteView通常用于更新远程的界面. 其实现了Paracelable接口,通过Bindler就可以传送到远程. 然后通过该类的 apply来更新界面. 其实,在我们通过该类 ...
- android remoteview 缓存,关于RemoteView的一点愚见(实现桌面小部件)
RemoteView中的应用除了有通知栏的自定义之外,还有桌面小部件也是通过RemoteView以及AppWidgetProvider来完成的. 实际上AppWidgetProvider是一个广播,即 ...
- android 自定义推送布局_Notification的基本用法以及使用RemoteView实现自定义布局
Notification的作用 Notification是一种全局效果的通知,在系统的通知栏中显示.既然作为通知,其基本作用有: 显示接收到短消息.即时信息等 显示客户端的推送(广告.优惠.新闻等) ...
最新文章
- [Springboot实战] 集成 Caffeine
- 一份传世典文:十年编程(Teach Yourself Programming in Ten Years)
- python工程师-如何面试Python后端工程师?
- FPGA 起脚nCEO/IO管教设置问题
- Object 标签遮挡 Div 显示
- 《长安十二时辰》背后的文娱大脑:如何提升爆款的确定性?
- VS2017中的附加到进程
- source insight怎样恢复默认界面设置
- AWS EC2实例Ubuntu系统设置root用户密码并使用root/ubuntu用户登录
- 功夫小子实践开发-游戏设置功能的实现
- 能源管理系统在企业中的应用及系统介绍
- MMKV_MMKV使用教程
- STM32单线串口对总线舵机的控制
- python如何调整图片大小_Python实现图片尺寸缩放脚本
- PHP生成缩略图、加水印
- 【读书笔记】吴军阅读与写作讲义
- SitePoint播客#57:不是负面
- 二十:让行内元素在div中垂直居中
- python中的英文歌_Python 爬网易音乐云歌曲,MV
- window10下Oracle 12c详细安装教程