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

本文详细介绍了Android平台上的Widget开发流程,包括创建、更新Widget的方法,处理Widget生命周期事件,实现点击事件,使用抽屉控件等内容,并提供了获取流量信息及文件摘要的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转载请注明出处:https://blog.youkuaiyun.com/mythmayor/article/details/72900348

1.创建Widget的步骤

  1. 创建一个类继承AppWidgetProvider

    public class MyWidget extends AppWidgetProvider {
    
    }
    
  2. 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的描述文件

  3. 描述文件

    <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的解决方法

  1. 应用安装到了SD卡中
  2. 卸载掉手机上的应用,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的生命周期

  1. onEnable():第一次widget被创建,初始化工作
  2. onDisable():最后一个widget被销毁的时候,擦屁股工作
  3. onUpdate():每当widget被创建的时候,以及updatePeriodMillis时间到的时候
  4. onDelete():每当widget被删除的时候调用
  5. onAppWidgetOptionsChanged():当widget被改变大小
  6. 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 "";
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值