App Widgets的使用

如果你想让你的软件也可以有桌面小控件的话就让我们一起来学习下Widgets

First

Adding the AppWidgetProviderInfo Metadata

就是要在清单文件配置

文件配置

配置元数据

<receiver android:name="ExampleAppWidgetProvider" > 
    <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>

Second

Adding the AppWidgetProviderInfo Metadata

The AppWidgetProviderInfo defines the essential qualities of an App Widget, such as its minimum layout dimensions, its initial layout resource, how often to update the App Widget, and (optionally) a configuration Activity to launch at create-time. Define the AppWidgetProviderInfo object in an XML resource using a single <appwidget-provider> element and save it in the project's res/xml/ folder.


第二步在清单文件里元数据 需要去配置下然后在mata-data里有个 resource 然后我们在res下去创建xml :其实就是显示在桌面上的大小,还有设置刷新时间,还有其他相关设置。(

 android:initialLayout="@layout/example_appwidget" )是你想让你桌面图标长啥样我就设置了几个
<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
    android:initialLayout="@layout/example_appwidget"
    android:minHeight="72.0dip"
    android:minWidth="294.0dip"
    android:updatePeriodMillis="0" />
说下
updatePeriodMillis="0"这里填0是说在桌面上刷新时间由自己设定

initialLayout  就是你想让小控件长什么样

<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" 
    android:minWidth="40dp" 
    android:minHeight="40dp" 
    android:updatePeriodMillis="86400000" 
    android:previewImage="@drawable/preview" 
    android:initialLayout="@layout/example_appwidget" 
    android:configure="com.example.android.ExampleAppWidgetConfigure"  
    android:resizeMode="horizontal|vertical" 
    android:widgetCategory="home_screen|keyguard" 
    android:initialKeyguardLayout="@layout/example_keyguard"> 
</appwidget-provider>

 第三步需要去配置一个广播(就是用于检测你选哪个小窗体) 

public class MyAppWidgetProvider extends AppWidgetProvider {
    /**
     * 当前广播生命周期只有10秒
     * @param context
     */
    public void onDisabled(Context context) {
        super.onDisabled(context);
        System.out.println("onDisabled");
        Intent intent = new Intent(context, KillprocessWidgetService.class);
        context.stopService(intent);
    }

    public void onEnabled(Context context) {
        super.onEnabled(context);
        System.out.println("onEnabled");
        Intent intent = new Intent(context, KillprocessWidgetService.class);
        context.startService(intent);
    }



}
//这里注意下我们如果耗时的操作就跳转到其他页面去操作因为广播周期一般就10左右。

第四步根据你的需求要让你的桌面小控件张啥样

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:background="@drawable/widget_bg_portrait"
    android:gravity="center_vertical" >

    <LinearLayout
        android:layout_width="0.0dip"
        android:layout_height="fill_parent"
        android:layout_marginLeft="5.0dip"
        android:layout_weight="1.0"
        android:background="@drawable/widget_bg_portrait_child"
        android:gravity="center_vertical"
        android:orientation="vertical"
        android:paddingBottom="3.0dip"
        android:paddingTop="2.0dip" >

        <TextView
            android:id="@+id/process_counts"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="15.0dip"
            android:textAppearance="@style/widget_text" />

        <ImageView
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_marginBottom="1.0dip"
            android:layout_marginTop="1.0dip"
            android:background="@drawable/widget_bg_portrait_child_divider" />

        <TextView
            android:id="@+id/process_memorys"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="15.0dip"
            android:textAppearance="@style/widget_text" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="center_horizontal"
        android:orientation="vertical" >

        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:gravity="center_vertical" >

            <ImageView
                android:layout_marginTop="3dp"
                android:layout_width="20.0dip"
                android:layout_height="20.0dip"
                android:src="@drawable/logs" />

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@string/app_name"
                android:textColor="#ffffffff" />
        </LinearLayout>

        <Button
            android:id="@+id/btn_clear"
            android:layout_width="90.0dip"
            android:layout_height="wrap_content"
            android:layout_centerVertical="true"
            android:layout_marginTop="5.0dip"
            android:background="@drawable/function_greenbutton_selector"
            android:text="一键清理"
            />
    </LinearLayout>

</LinearLayout>
写到这里从小窗口拖出到桌面就可以长成这样了。

实现相应功能的话我说下几个内容

1注意我们这是相当于一个程序app页面需要去展现到另一个程序上面 要的到view对象 是一个远程view

初始化远程view这和我们以前得到view 对象有所不同

 RemoteViews views = new RemoteViews(getPackageName(), R.layout.example_appwidget);
 

public class KillprocessWidgetService extends Service {

    private AppWidgetManager widgetManager;
    private TimerTask timerTask;
    private TimerTask timerTask1;
    private TimerTask timerTask11;

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        widgetManager = AppWidgetManager.getInstance(this);
        //每隔5秒更新桌面
        Timer timer=new Timer();
        //初始化一个远程的view
//第一个是一个上下文
//第二个参数表示当前哪一个广播处理这个桌面小控件
// System.out.println("晗宝宝");
        timerTask11 = new TimerTask() {

            public void run() {
                //初始化一个远程的view
                RemoteViews views = new RemoteViews(getPackageName(), R.layout.example_appwidget);
                views.setTextViewText(R.id.process_counts,"正在运行的软件"+String.valueOf(SystemInfoUtils.getProcessCount(getApplicationContext())));
                views.setTextViewText(R.id.process_memorys, "可用内存"+Formatter.formatFileSize(getApplicationContext(),SystemInfoUtils.getAvailMem(getApplicationContext())));
                //第一个是一个上下文
                //第二个参数表示当前哪一个广播处理这个桌面小控件
                Intent intent = new Intent();
                //发送一个隐式意图
                intent.setAction("com.Meiko.safe");
                PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, intent, 0);
                //pendingIntent:to send when user clicks就是当用户点击时发送给谁
                views.setOnClickPendingIntent(R.id.btn_clear,pendingIntent);
                ComponentName proviede=new ComponentName(getApplicationContext(), MyAppWidgetProvider.class);
               // System.out.println("晗宝宝");
               widgetManager.updateAppWidget(proviede,views);
            }
        };
        timer.schedule(timerTask11,0,5000);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值