如何在Android实现桌面清理内存简单Widget小控件

 我来答
huanglenzhi
2016-04-20 · 知道合伙人数码行家
huanglenzhi
知道合伙人数码行家
采纳数:117538 获赞数:517195
长期从事计算机组装,维护,网络组建及管理。对计算机硬件、操作系统安装、典型网络设备具有详细认知。

向TA提问 私信TA
展开全部

一、UI部分的编写:

参照Google的文档,首先在建立一个类继承AppWidgetProvider


import android.appwidget.AppWidgetProvider;

public class MyWidget extends AppWidgetProvider {

}

然后在清单文件中申明它,我们必须注意到,AppWidgetProvider实际上是BroadcastReceiver,所以要注册成一个receiver,然后还有一些其他的东西需要注意:


<receiver android:name="com.alexchen.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.appwidget.action.APPWIDGET_UPDATE 表明这个receiver能够接受一个APPWIDGET_UPDATE的广播,而且在这里,只能加入这一个action。

android.appwidget.provider 表明数据类型时widget提供者提供的数据,example_appwidget_info表明这个widget的参数配置文件名和位置


那么接下来就需要在res目录下建立一个xml文件夹,并且在其中建立一个example_appwidget_info.xml的配置文件,Google的文档中给出了示例有很多参数,实际上关键的参数只有下面的4个:


<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
   android:minWidth="94dp"
   android:minHeight="72dp"
   android:updatePeriodMillis="86400000"
   android:initialLayout="@layout/example_appwidget">
</appwidget-provider>

其中,minWidth和minHeight代表这个widget控件所占据的最小空间,这个空间一般来讲不需要太大,因为太大的话,一个屏幕可能都没办法放下,Google的官方文档的说法是大于4x4的就可能无法显示。

updatePeriodMillis代表数据更新的时间,这里86400000毫秒实际上是24小时,可能最开始看到这个参数会想我能否将其设的很小,每一秒刷新很多次?,实际上对于updatePeriodMillis这个参数而言,即算你设的再小也没用,Google设定widget控件这个参数控制的最短update时间为30分钟,就算将其设置在30分钟以内也会以30分钟的频率来更新数据。

initialLayout参数代表的是本widget空间的布局文件。


那么下一步就是定义出一个对应的布局文件。我们可以简单的在layout目录下建立一个布局文件example_appwidget.xml


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="200dp"
   android:layout_height="80dp"
   android:background="@android:color/white"
   android:gravity="center_vertical"
   android:orientation="vertical" >

   <TextView
       android:id="@+id/tv_widget"
       android:layout_width="fill_parent"
       android:layout_height="wrap_content"
       android:gravity="center"
       android:text="widget控件测试"
       android:textColor="@android:color/black"
       android:textSize="15sp" />

   <Button
       android:id="@+id/btn_clear"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:layout_gravity="center_horizontal"
       android:text="清理内存"
       android:textColor="#ff000000" />

</LinearLayout>


在Google的文档中有指出,并非所有的布局组件都可以在上面的这个布局中生效,有效的组件或布局为:


至此,一个简单的widget控件就写好了,我们可以在模拟器上将其拖到桌面上看一看效果:


二、功能逻辑部分的实现

大部分的Widget小控件都会需要在特定情况下更新上面显示的数据,那么这个是如何实现的呢,我们经过上面的代码不难发现实际上这个widget控件并没有一个Activity,所以说这个控件的显示实际上不是本应用来实现的,它实际上是桌面这个应用来显示的,所以我们也不可能直接去更新它上面的数据。


回过头去看看上面我们写的那个receiver,实际上没有实现任何方法。实际上AppWidgetProvider里面有几个比较重要的方法:onReceive、onUpdate、onDisabled、onEnabled

其中onReceive方法跟大多数广播接收者的onReceive方法一样,但是在这里,onReceive方法的调用并不是我们可以决定的,它依赖于显示该widget控件的Host组件,在这里也就是Android桌面应用,所以我们会发现在不同的手机上,将widget控件拖到桌面上显示的时候onReceive可能调用的次数和先后顺序可能完全不一样,这依赖于Host组件是如何实现的。

所以在这里onReceive方法对于我们刷新widget数据基本没有什么帮助。


而onUpdate方法则是由上面所说的updatePeriodMillis参数来控制的,经过上面的分析,我们都知道了,它的最小周期为30分钟。所以我们一般将这个参数设为0即可。那么在这个方法里,我们往往会在其中放置一些启动更新数据服务的功能,因为如果后台的更新数据的Service被意外停止了,那么每30分钟还会被重新启用,不至于一直启动不了了:

@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
int[] appWidgetIds) {
super.onUpdate(context, appWidgetManager, appWidgetIds);
// System.out.println("onUpdate");
//每隔一段时间重新启动服务,防止服务中间被终止了之后没法重启
Intent intent = new Intent(context, UpdateWidgetService.class);
context.startService(intent);
}

下面是比较重要的两个方法了:onDisabled和onEnabled

我们知道,widget小控件是可以拖动多个到桌面上的,而onEnabled方法会在第一个widget控件拖到桌面上的时候调用一次,onDisabled会在最后一个widget控件从桌面被删除时调用一次,那么我们需要做的就是在onEnabled这个方法中启用一个刷新widget数据的服务,在onDisabled方法中使用stopService方法来停止这个服务。

@Override
public void onDisabled(Context context) {
super.onDisabled(context);
System.out.println("onDisabled");
//停止数据刷新服务
Intent intent = new Intent(context, UpdateWidgetService.class);
context.stopService(intent);
}

@Override
public void onEnabled(Context context) {
super.onEnabled(context);
System.out.println("onEnabled");
//开启数据刷新服务
Intent intent = new Intent(context, UpdateWidgetService.class);
context.startService(intent);
}

育知同创教育
2016-04-20 · 百度知道合伙人官方认证企业
育知同创教育
1【专注:Python+人工智能|Java大数据|HTML5培训】 2【免费提供名师直播课堂、公开课及视频教程】 3【地址:北京市昌平区三旗百汇物美大卖场2层,微信公众号:yuzhitc】
向TA提问
展开全部
参照Google的文档,首先在建立一个类继承 AppWidgetProvider
import android.appwidget.AppWidgetProvider;

public class MyWidget extends AppWidgetProvider {

}

然后在清单文件中申明它,我们必须注意到,AppWidgetProvider实际上是BroadcastReceiver,所以要注册成一个receiver,然后还有一些其他的东西需要注意:
<receiver android:name="com.alexchen.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.appwidget.action.APPWIDGET_UPDATE
表明这个receiver能够接受一个APPWIDGET_UPDATE的广播,而且在这里,只能加入这一个action。
android.appwidget.provider
表明数据类型时widget提供者提供的数据, example_appwidget_info
表明这个widget的参数配置文件名和位置

那么接下来就需要在res目录下建立一个xml文件夹,并且在其中建立一个
example_appwidget_info.xml
的配置文件,Google的文档中给出了示例有很多参数,实际上关键的参数只有下面的4个:
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
android:minWidth="94dp"
android:minHeight="72dp"
android:updatePeriodMillis="86400000"
android:initialLayout="@layout/example_appwidget">
</appwidget-provider>

其中, minWidth 和 minHeight
代表这个widget控件所占据的最小空间,这个空间一般来讲不需要太大,因为太大的话,一个屏幕可能都没办法放下,Google的官方文档的说法是大于4x4的就可能无法显示。

updatePeriodMillis
代表数据更新的时间,这里86400000毫秒实际上是24小时,可能最开始看到这个参数会想我能否将其设的很小,每一秒刷新很多次?,
实际上对于 updatePeriodMillis
这个参数而言,
即算你设的再小也没用,Google设定widget控件这个参数控制的最短update时间为30分钟,就算将其设置在30分钟以内也会以30分钟的频率来更新数据。

initialLayout 参数代表的是本widget空间的布局文件。

那么下一步就是定义出一个对应的布局文件。我们可以简单的在layout目录下建立一个布局文件example_appwidget.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="200dp"
android:layout_height="80dp"
android:background="@android:color/white"
android:gravity="center_vertical"
android:orientation="vertical" >

<TextView
android:id="@+id/tv_widget"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:text="widget控件测试"
android:textColor="@android:color/black"
android:textSize="15sp" />

<Button
android:id="@+id/btn_clear"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="清理内存"
android:textColor="#ff000000" />

</LinearLayout>
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
xyAND隐
2016-04-20 · TA获得超过787个赞
知道小有建树答主
回答量:822
采纳率:55%
帮助的人:330万
展开全部
安装360等安全软件,才会有小组件,有了才能设置
网络上也有一些,不过来路不明,不安全,有很大的安全隐患
另外安卓平台的软件大都开机自启,清理后,过不了一分钟又自启了,所以没有多大意义;养成良好的软件使用习惯才是关键
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式