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);
}
});

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

记得注册组件

<receiver
android:name=".MyWidgetProvider"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter> <meta-data
android:name="android.appwidget.provider"
android:resource="@xml/widget_provider" />
</receiver>

效果图

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

一些总结

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

工程下载

传送门:下载

Android实现AppWidget、Broadcast动态注册的更多相关文章

  1. Android中的BroadCast静态注册与动态注册

    1.静态注册 新建MyBroadcast类继承BroadcastReceiver,实现onReceive方法 /** * Author:JsonLu * DateTime:2015/9/21 16:4 ...

  2. Android Studio NDK JNI动态注册本地方法

    概述 可能大家觉得javah生成的函数名又臭又长,不太好看.这里可以提供另外一种方法来动态注册c++函数,让其根Java中的native方法关联起来. 实现 这里通过JNIEnv的Resisterna ...

  3. Android实现AppWidget、Broadcast静态注册

    Android实现AppWidget.Broadcast静态注册 本篇博客是基于我上一篇博客继续修改的,详情请看Android实现AppWidget.Broadcast动态注册 开发工具:Andori ...

  4. Android(java)学习笔记173:BroadcastReceiver之 静态注册 和 动态注册

    1. 广播接受者>什么是广播.收音机.电台:对外发送信号.收音机:接收电台的信号. >在android系统里面,系统有很多重要的事件: 电池电量低,插入充电器,sd卡被移除,有电话打出去, ...

  5. Android(java)学习笔记116:BroadcastReceiver之 静态注册 和 动态注册

    1. 广播接受者>什么是广播.收音机.电台:对外发送信号.收音机:接收电台的信号. >在android系统里面,系统有很多重要的事件: 电池电量低,插入充电器,sd卡被移除,有电话打出去, ...

  6. BroadcastReceiver的两种注册方式之------动态注册

    activity_main.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android&qu ...

  7. Android广播接收器Broadcast Receiver-android学习之旅(十二)

    首先继承BroadcastReceiver类,并在manifest中注册 public class MyReceiver extends BroadcastReceiver { public MyRe ...

  8. Android开发4: Notification编程基础、Broadcast的使用及其静态注册、动态注册方式

    前言 啦啦啦~(博主每次开篇都要卖个萌,大家是不是都厌倦了呢~) 本篇博文希望帮助大家掌握 Broadcast 编程基础,实现动态注册 Broadcast 和静态注册 Broadcast 的方式以及学 ...

  9. Android Broadcast Receiver注册

    之前有关 Broadcast Receiver的链 动态注册 1.我们新建一个广播接受类,我们创建一个内部类让他继承BroadcastReceiver,并且重新其中当有广播来到时执行的方法onRece ...

随机推荐

  1. PAT1023. Have Fun with Numbers

    //水题,但是考点不水,可能用的strlen属于string库,但是只能用于字符,不能用数字,因为\0就是0.出现0无法判断,其次二倍时有可能有进位 //第一次在二倍进位上出了问题 #include& ...

  2. 【IHttpHandler】了解 IHttpHandler

    1 .概述 说明:HttpHandler是一个HTTP请求的真正处理中心.在HttpHandler容器中,ASP.NET Framework才调用HttpHandler的ProcessRequest成 ...

  3. Linux设备驱动开发环境的搭建(转)

    经过两周的摸索,终于对Linux设备驱动开发有了个初步的认识,下面对Linux设备驱动开发环境的搭建做个小结,以方便自己以后查询,同时也能给同道的初学者一点帮助. 刚接触Linux设备驱动时,初学者往 ...

  4. 用Grunt搭建基于LESS的前端html开发框架

    . 安装Node.js    http://nodejs.org/download/ 2. 加速NPM安装    npm install -g cnpm --registry=http://r.cnp ...

  5. angular $apply()以及$digest()讲解

    重点的东西放上面,说三遍: 记住的最重要的是ng是否能检测到你对于model的修改.如果它不能检测到,那么你就需要手动地调用$apply()! 记住的最重要的是ng是否能检测到你对于model的修改. ...

  6. 会"说话"的勒索病毒Cerber

    最近有个案子与勒索病毒有关,证物是个台式机,运行Windows 7 64bit操作系统,委托方是某高科技公司,希望能调查出事发的关键时间点.感染来源及途径.恶意程序文件名等相关信息. 在对证物计算机进 ...

  7. 关于解决pyinstaller2.1将.py打包成exe文件在中文目录下不能执行的问题

    关于解决pyinstaller2.1将.py打包成exe文件在中文目录下不能执行的问题 这个问题困扰我好久了,今天终于非常偶然的在http://www.v2ex.com/t/113856#reply1 ...

  8. 如何在某个按钮上触发 bootstarp Modal 组件

    <?php Modal::begin([ 'id'=>'myModal', 'header' => '<h2>标题</h2>']); echo '内容'; M ...

  9. IOS基础——alloc、init和new方法

    alloc:分配内存. init:初始化. new:代替上面两个函数:分配内存,并且初始化. 注意: 1.在实际开发中很少会用到new,一般创建对象时我们一般是 [[className alloc]i ...

  10. Cron和Spring定时任务

    1.Java Spring spring定时任务cronExpression的值(配置定时时间)格式说明: 一个cronExpression表达式有至少6个(也可能是7个)由空格分隔的时间元素.从左至 ...