博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android实现AppWidget、Broadcast动态注册
阅读量:4322 次
发布时间:2019-06-06

本文共 3308 字,大约阅读时间需要 11 分钟。

Android实现AppWidget、Broadcast动态注册

开发工具:Andorid Studio 1.3

运行环境:Android 4.4 KitKat

工程内容

  1. 主界面可以编辑广播的信息,点击发送广播的按钮发送广播
  2. 主页面上设置一个按钮进行广播接收器的注册与注销
  3. 广播接收器若已被注册,发送的广播信息能够及时更新桌面上Widget上文字内容
  4. 点击Widget可以跳转回主页面

代码实现

添加一个自定义Widget类,继承自AppWidgetProvider,重写onUpdate函数,通过RemoteView对象修改Widget中的TextView的值,AppWidgetManager被调用更新Widget

public class MyWidgetProvider extends AppWidgetProvider {    @Override    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds){        super.onUpdate(context, appWidgetManager, appWidgetIds);        Intent intent = new Intent(context, MainActivity.class);        PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);        // Use RemoteView to update Widget        RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_layout);        remoteViews.setOnClickPendingIntent(R.id.widget_text, pendingIntent);        // Update AppWidget        appWidgetManager.updateAppWidget(appWidgetIds, remoteViews);    }}

添加一个自定义的广播接收器集成自BroadcastReceiver,重写onReceive函数,通过RemoteView对象修改Widget中的TextView的值为传入intent的消息,然后用AppWidgetManager发送RemoteView通知MyWidgetProvider更新内容

public class MyBroadcastReceiver extends BroadcastReceiver {    @Override    public void onReceive(Context context, Intent intent){        // Use RemoteViews to update Widget        RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_layout);        // Set editText        remoteViews.setTextViewText(R.id.widget_text, intent.getStringExtra("message"));        AppWidgetManager.getInstance(context).updateAppWidget(new ComponentName(context.getApplicationContext(),                MyWidgetProvider.class), remoteViews);    }}

在MainActivity.java里面,新建一个MyBroadcastReceiver对象,给注册按钮添加响应动态注册和注销MyBroadcastReceiver,注册时设置的intentFilter内容需要和后面广播时一致

final Button regBroCast = (Button)this.findViewById(R.id.regBroadcast);regBroCast.setOnClickListener(new View.OnClickListener() {    @Override    public void onClick(View view) {        if(isRegister){            unregisterReceiver(myBroadcastReceiver);            regBroCast.setText(getResources().getString(R.string.regBroadcast));            isRegister = false;        } else {            registerReceiver(myBroadcastReceiver, new IntentFilter(getResources().getString(R.string.sysu)));            regBroCast.setText(getResources().getString(R.string.unRegBroadcast));            isRegister = true;        }    }});

在MainActivity.java里面,给发送按钮添加响应,intent包中放入要修改的文字,给intent设置的文字需要和上面MyBroadcastReceiver中的intentFilter一致

Button send = (Button)this.findViewById(R.id.send);send.setOnClickListener(new View.OnClickListener() {    @Override    public void onClick(View view) {        Intent intent = new Intent(getResources().getString(R.string.sysu));        intent.putExtra("message", mainEditText.getText().toString());        sendBroadcast(intent);    }});

至此,关键内容已列出,程序运行正常

记得注册组件

效果图

没注册时敲hello world并发送->界面没有内容出现->注册后发送->widget中出现hello world

cant showcant showcant showcant show

一些总结

  1. 新建一个widget的时候尽量使用代码自己添加,不要使用菜单new文件出来,android studio还不是很完善,new出来的widget附带很多不必要的东西,重载的时候会出错
  2. 新建一个类的时候要注意不同的类放在哪个包里面,只有在同一个包中才能省略前面的包名,否则连接时需要敲上全部的包名及路径
  3. Widget中的默认样式没有底色,字体颜色也容易和背景融合在一块,所以便于我们调试开发,可以暂时把底色改成别的颜色,易于观察开发即可

工程下载

传送门:

转载于:https://www.cnblogs.com/wsine/p/5169227.html

你可能感兴趣的文章
Linux IPC实践(3) --具名FIFO
查看>>
Qt之模拟时钟
查看>>
第一次接触安卓--记于2015.8.21
查看>>
(转)在分层架构下寻找java web漏洞
查看>>
mac下多线程实现处理
查看>>
C++ ifstream ofstream
查看>>
跟初学者学习IbatisNet第四篇
查看>>
seL4环境配置
查看>>
Git报错:insufficient permission for adding an object to repository database .git/objects
查看>>
ajax跨域,携带cookie
查看>>
BZOJ 1600: [Usaco2008 Oct]建造栅栏( dp )
查看>>
洛谷 CF937A Olympiad
查看>>
Codeforces Round #445 C. Petya and Catacombs【思维/题意】
查看>>
用MATLAB同时作多幅图
查看>>
python中map的排序以及取出map中取最大最小值
查看>>
ROR 第一章 从零到部署--第一个程序
查看>>
<form>标签
查看>>
vue去掉地址栏# 方法
查看>>
Lambda03 方法引用、类型判断、变量引用
查看>>
was集群下基于接口分布式架构和开发经验谈
查看>>