Android - Widget,Widget生命周期点击事件,抽屉控件,获取总流量和单个应用的流量,获取文件的数字摘要

xiaoxiao2021-02-28  105

转载请注明出处:https://blog.csdn.net/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.csdn.net/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 ""; } }
转载请注明原文地址: https://www.6miu.com/read-48437.html

最新回复(0)