android中如何在窗口小插件(widget),中使用自定义进度条

linsongming 2015-11-11 10:08:49
各位大大,最近在开发一个任务管理器,widget部分要做一个进度条显示当前内存使用情况,点击能清理内存,app运行后往桌面添加widget提示小插件加载故障,我的widgetProvider类如下:

package com.example.android_dev.taskkiller.activity;

import android.app.PendingIntent;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;

import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;

import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.net.Uri;

import android.util.Log;

import android.widget.RemoteViews;
import android.widget.Toast;

import com.example.android_dev.taskkiller.R;

import com.example.android_dev.taskkiller.Service.MyWidgetService;
import com.example.android_dev.taskkiller.biz.Process_biz;
import com.lidroid.xutils.ViewUtils;
import com.lidroid.xutils.view.annotation.ViewInject;

import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;


/**
* Created by Android-DEV on 2015/10/22.
*/
public class MyWidgetProvider extends AppWidgetProvider{
private int progress ;
String availMemStr;
String info;

private static final String TAG = "MyWidgetProvider";

/** 启动AppWidgetService服务对应的action */
private final Intent my_widget_service_intent=new Intent("android.action.MY_WIDGET_SERVICE");


/** 更新 widget 的广播对应的action */
private final String ACTION_WIDGET_RECEIVE="com.example.task_killer.widget.click";


/** 保存 widget 的id的HashSet,每新建一个 widget 都会为该 widget 分配一个 id*/
private static Set idsSet = new HashSet();

/** 图片信息 */
private static final int Layout_Show = 1;

/** 内存使用情况 */
private static double totality; //总内存
private static double available; //可用内存

/* @ViewInject(R.id.widget_progress_bar)
private ArcProgressBar arcProgressBar;*/

private boolean DEBUG = false;



@Override
public void onDeleted(Context context, int[] appWidgetIds) {

super.onDeleted(context, appWidgetIds);
/** 当 widget 被删除时,对应的删除set中保存的widget的id */
for (int appWidgetId : appWidgetIds) {
idsSet.remove(Integer.valueOf(appWidgetId));
}
prtSet();

}

@Override
public void onEnabled(Context context) {
super.onEnabled(context);

Intent eintent = new Intent(createExplicitFromImplicitIntent(context,my_widget_service_intent));
context.startService(eintent);

Log.i("TAG", "onEnabled");
/** 当前内存使用情况 */
Process_biz biz = Process_biz.getInstance(context);
String am = biz.getSystemAvaialbeMemorySize();
String bm = biz.getTotalMemory();
totality = Double.valueOf(bm);
available = Double.valueOf(am);





}

@Override
public void onDisabled(Context context) {
super.onDisabled(context);

Log.i("TAG", "onDisabled");
Intent eintent = new Intent(createExplicitFromImplicitIntent(context,my_widget_service_intent));
context.stopService(eintent);
}

public static Intent createExplicitFromImplicitIntent(Context context, Intent implicitIntent) {
// Retrieve all services that can match the given intent
PackageManager pm = context.getPackageManager();
List<ResolveInfo> resolveInfo = pm.queryIntentServices(implicitIntent, 0);

// Make sure only one match was found
if (resolveInfo == null || resolveInfo.size() != 1) {
return null;
}

// Get component info and create ComponentName
ResolveInfo serviceInfo = resolveInfo.get(0);
String packageName = serviceInfo.serviceInfo.packageName;
String className = serviceInfo.serviceInfo.name;
ComponentName component = new ComponentName(packageName, className);

// Create a new intent. Use the old one for extras and such reuse
Intent explicitIntent = new Intent(implicitIntent);

// Set the component to be explicit
explicitIntent.setComponent(component);

return explicitIntent;
}

@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
super.onUpdate(context, appWidgetManager, appWidgetIds);
Log.i("TAG", "onUpdate");

/** 每次 widget 被创建时,对应的将widget的id添加到set中 */
for(int appWidgetId:appWidgetIds){
idsSet.add(Integer.valueOf(appWidgetId));
}
prtSet();



}


@Override
public void onReceive(Context context, Intent intent) {
super.onReceive(context, intent);
Log.i("TAG","intent = " + intent);
if(intent.getAction().equals("com.example.task_killer.widget.click")){
Log.i("TAG", "onReceive");

updatepWidgets(context, AppWidgetManager.getInstance(context), idsSet);
}


}


private void updatepWidgets(Context context, AppWidgetManager appWidgetManager, Set set){

/** widget 的id */
int appID;
/** 迭代器,用于遍历所有保存的widget的id */
Iterator it = set.iterator();

while(it.hasNext()){
appID = ((Integer)it.next()).intValue();

/** 获取对应的布局 */
RemoteViews remoteViews = new RemoteViews(context.getPackageName(),R.layout.widget_layout);
int a =(int) ((totality-available)/totality*100);
String b = String.valueOf(a);
remoteViews.setTextViewText(R.id.widget_tv,b+"%");
// remoteViews.setProgressBar(R.id.widget_progress_bar,(int)totality,(int)(totality-available),true);
/*double b = /totality;
arcProgressBar.addProgress(236);*/
/** 设置点击按钮对应的PendingIntent:即点击按钮时,发送广播。 */
remoteViews.setOnClickPendingIntent(R.id.widget_layout, getPendingIntent(context, Layout_Show));

/** 更新widget */
appWidgetManager.updateAppWidget(appID,remoteViews);
}

}

private PendingIntent getPendingIntent(Context context, int layout_Id) {
Intent intent = new Intent();
intent.setClass(context,MyWidgetProvider.class);
intent.addCategory(Intent.CATEGORY_ALTERNATIVE);
intent.setData(Uri.parse("custom:" + layout_Id));
PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent, 0 );
return pi;

}

/** 调试用:遍历set */
private void prtSet() {
if (DEBUG) {
int index = 0;
int size = idsSet.size();
Iterator it = idsSet.iterator();
Log.d(TAG, "total:"+size);
while (it.hasNext()) {
Log.d(TAG, index + " -- " + ((Integer)it.next()).intValue());
}
}
}


}

...全文
107 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
哎,真难 2015-11-12
  • 打赏
  • 举报
回复
你的问题是啥
杰哥哥啊 2015-11-12
  • 打赏
  • 举报
回复
把log贴出来看看

80,351

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧