转载请注明出处:https://blog.youkuaiyun.com/mythmayor/article/details/72900348
1.创建Widget的步骤
创建一个类继承AppWidgetProvider
public class MyWidget extends AppWidgetProvider { }
Widget就是一个广播接收者,所以在清单文件中进行配置
<receiver android:name="com.mythmayor.widget.MyWidget" > <intent-filter> <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> </intent-filter> <meta-data android:name="android.appwidget.provider" android:resource="@xml/example_appwidget_info" /> </receiver>
android:name 处配置全类名
android:resource 处配置一个Widget的描述文件描述文件
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" android:initialLayout="@layout/test" //布局文件 android:minHeight="40dp" android:minWidth="40dp" android:updatePeriodMillis="86400000" > </appwidget-provider>
2.手机中找不到Widget的解决方法
- 应用安装到了SD卡中
- 卸载掉手机上的应用,clean下工程,重新安装
3.更新Widget
1. 获取AppWidgetManager对象
AppWidgetManager awm=AppWidgetManager.getInstance(Context context);
2. 创建RemoteViews关联widget布局文件并操作widget的控件
RemoteViews views = new RemoteViews(getPackageName(), int layoutId);
views.setTextViewText(int viewId,CharSequence text); //给对应id的TextView设置文本
views.setImageViewResource(int viewId, int srcId); //给对应ID的ImageView设置图片
//给对应id的ListView设置适配器,适配器为一个继承RemoteViewsService的服务,
//该服务要返回一个RemoteViewsFactory,这个RemoteViewsFactory里就有getCount()
//和getViewAt(position)的方法了,同BaseAdapter
views.setRemoteAdapter(int viewId, Intent intent);
3. 执行更新Widget动作
awm.updateAppWidget(new ComponentName(getApplicationContext(),MyWidget.class), views);
相关网页:[Widget中使用ListView](http://blog.youkuaiyun.com/liliang497/article/details/8308313)
4.Widget的生命周期
- onEnable():第一次widget被创建,初始化工作
- onDisable():最后一个widget被销毁的时候,擦屁股工作
- onUpdate():每当widget被创建的时候,以及updatePeriodMillis时间到的时候
- onDelete():每当widget被删除的时候调用
- onAppWidgetOptionsChanged():当widget被改变大小
onReceive():其他是声明周期事件都是通过onReceive分发的
// AppWidgetProvider public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (AppWidgetManager.ACTION_APPWIDGET_UPDATE.equals(action)) { ... } else if (AppWidgetManager.ACTION_APPWIDGET_DELETED.equals(action)) { ... } else if (AppWidgetManager.ACTION_APPWIDGET_OPTIONS_CHANGED.equals(action)) { ... } else if (AppWidgetManager.ACTION_APPWIDGET_ENABLED.equals(action)) { ... } else if (AppWidgetManager.ACTION_APPWIDGET_DISABLED.equals(action)) { ... } }
5.Widget的点击事件
PendingIntent:延期的意图,是让另外一个应用程序帮我们执行的意图,相当于一个回调。当满足某些条件后,可以通过PendingIntent打开Activity、Service或者发送广播
//自定义的广播消息。
Intent intent = new Intent();
intent.setAction("com.mythmayor.project.killall");
PendingIntent pendingIntent = PendingIntent.getBroadcast(
UpdateWidgetService.this, 0, intent,
PendingIntent.FLAG_UPDATE_CURRENT);
//给按钮注册一个点击事件,事件是一个延期的意图
views.setOnClickPendingIntent(R.id.btn_clear, pendingIntent);
6.抽屉控件
SlidingDrawer:一定要配置android:handle(把手)和android:content(内容),并在子View中添加把手和内容的布局
<SlidingDrawer
android:layout_width="match_parent"
android:layout_height="match_parent"
android:content="@+id/content"
android:handle="@+id/handle"
android:orientation="horizontal" >
<ImageView
android:id="@id/handle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/detail" />
<LinearLayout
android:id="@id/content"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#22000000"
android:gravity="center"
android:orientation="vertical" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="我是抽屉里面的内容" />
</LinearLayout>
</SlidingDrawer>
7.获取总流量
TrafficStats.getMobileRxBytes(); //总的移动网络下载流量
TrafficStats.getMobileTxBytes();//总的移动网络上传流量
TrafficStats.getTotalRxBytes();//总的下载流量
TrafficStats.getTotalTxBytes();//总的网络流量
8.获取单个应用的流量
PackageManager pm = context.getPackageManager();
List<PackageInfo> packInfos = pm.getInstalledPackages(0);
packageInfo.applicationInfo.uid
TrafficStats.getUidRxBytes(int uid);//某个应用的下载流量
TrafficStats.getUidTxBytes(int uid);//某个应用的上传流量
9.流量信息保存位置
上传:/proc/uid_stat/[uid]/tcp_snd |udp_snd
下载:/proc/uid_stat/[uid]/tcp_rcv |udp_rcv
10.获取文件的数字摘要
/**
* 根据文件路径得到文件的md5算法生成的数字摘要
* @param path
* @return
*/
private String getFileMd5(String path){
try {
File file = new File(path);
//得到一个数字摘要器
MessageDigest digest = MessageDigest.getInstance("MD5");
FileInputStream fis = new FileInputStream(file);
byte[] buffer = new byte[1024];
int len = 0;
while((len = fis.read(buffer))!=-1){
digest.update(buffer,0,len);
}
byte[] result = digest.digest();
StringBuilder sb = new StringBuilder();
for(byte b:result){
int number = b&0xff;
String str = Integer.toHexString(number);
if(str.length()==1){
sb.append("0");
}
sb.append(str);
}
return sb.toString();
} catch (Exception e) {
e.printStackTrace();
return "";
}
}