Android动态注册自定义协议,Android实现AppWidget、Broadcast动态注册

Android实现AppWidget、Broadcast动态注册

开发工具:Andorid Studio 1.3

运行环境:Android 4.4 KitKat

工程内容

主界面可以编辑广播的信息,点击发送广播的按钮发送广播

主页面上设置一个按钮进行广播接收器的注册与注销

广播接收器若已被注册,发送的广播信息能够及时更新桌面上Widget上文字内容

点击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);

}

});

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

记得注册组件

android:name=".MyWidgetProvider"

android:label="@string/app_name">

android:name="android.appwidget.provider"

android:resource="@xml/widget_provider" />

效果图

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

371f1ce87f4c43315b00d7cb8b092295.png

be50900c8f4f17c96f9c1fbd60228de2.png

1f9d80ec2040498b93e5c6a4ab6e6c0c.png

f782047fc82bd6154670e7f856109f26.png

一些总结

新建一个widget的时候尽量使用代码自己添加,不要使用菜单new文件出来,android studio还不是很完善,new出来的widget附带很多不必要的东西,重载的时候会出错

新建一个类的时候要注意不同的类放在哪个包里面,只有在同一个包中才能省略前面的包名,否则连接时需要敲上全部的包名及路径

Widget中的默认样式没有底色,字体颜色也容易和背景融合在一块,所以便于我们调试开发,可以暂时把底色改成别的颜色,易于观察开发即可

工程下载

传送门:下载

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

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

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

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

Android实现AppWidget、Broadcast静态注册

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

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

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

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

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

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

activity_main.xml

Android Studio .grade文件知识

1.位置 2.问题:当AndroidStudio版本不同的时候,导致.gradle文件版本不同(当前为2.10),因为AndroidStudio升级的时候会自动升级.gradle.这样通过svn加载到 ...

c++ primer plus 习题答案(7)

p427.4 //头文件: #include #ifndef STACK_H_ #define STACK_H_ typedef unsigned long Item; ...

【poj解题】3664

简单,两次排序 #include #include #include #define MAX 500 ...

React Native 填坑之神奇的报错,已解决

下面对报错进行一下详细描述: 在debug时,点着点着,就会发生: 1.手机显示如下 : Attempted to transition from state `RESPONDER_INACTIVE_ ...

Android SD卡读写

package com.jredu.zuiyou.activity; import android.os.Bundle;import android.os.Environment;import and ...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值