public void updateFullView() {
RemoteViews rv = new RemoteViews(mContext.getPackageName(), R.layout.main_full_view_demo);
rv.setOnClickPendingIntent(R.id.main_full_view_demo_btn_left_top, makeButtonIntent(R.id.main_full_view_demo_btn_left_top));
rv.setOnClickPendingIntent(R.id.main_full_view_demo_btn_left_bottom, makeButtonIntent(R.id.main_full_view_demo_btn_left_bottom));
rv.setOnClickPendingIntent(R.id.main_full_view_demo_btn_right_top, makeButtonIntent(R.id.main_full_view_demo_btn_right_top));
rv.setOnClickPendingIntent(R.id.main_full_view_demo_btn_right_bottom, makeButtonIntent(R.id.main_full_view_demo_btn_right_bottom));
CanbusManager.Instance().getFullViewHelper().updateRemoteUi(rv);
}复制代码
1.首先是new RemoteViews的实例, 参数是包名和layout的id复制代码
• 特别注意: 如果RemoteViews会发生变化, 必须每次都new一个, 再去设置其状态, 不允许持有其对象后不停的更新, 这是由于RemoteViews的工作机制决定的, 有兴趣的可以去研究一下具体的原因.
• 这里要非常注意的是: 这里的layout只能使用RemoteViews支持的基本Layout和View, 完整的列表如下
• Layout: AdapterViewFlipper, FrameLayout, GridLayout, GridView, LinearLayout, ListView, RelativeLayout, StackView, ViewFlipper
• View: AnalogClock, Button, Chronometer, ImageButton, ImageView, ProgressBar, TextClock, TextView
• 可见种类是非常少的, 但其它的效果是可以实现的, 如果有一些复杂的情况, 可以使用 ImageView 来做扩展.
• 如果layout不规范, 并不会在调用端报错, 而会在倒车那个应用报异常, 所以如果发现没有显示, 需要看一下carVideo工程的log
2.第二步就是设置监听, 因为是跨进程的处理, 所以回调都是通过Intent来传递的, 在我们这里主要用的是广播复制代码
• PendingIntent的使用需要注意一些点使用setOnClickPendingIntent来设置
如果需要区分不同的Button, 有两种方式: a.使用不同的action (如果按钮过多不推荐) ,b.使用同一个action,然后使用extra设置id, 但这里需要注意生成PendingIntent的requestCode要不相同.
因为PendingIntent的生成会先找已经存在的, 已经存在则不修改, 而判断是否是相同的Intent使用的是Intent.filterEquals(), 这个函数不会检查Extra数据, 具体的判断条件可以看代码.
Intent需要设置packageName, 让广播仅发送到自己的包
注意广播接收器在onDestory时要进行反注册
3.第三步是调用FullViewHelper的updateRemoteUi()复制代码
具体使用如下代码:
复制代码