您的位置:首页 > 移动开发

窗口小部件的使用AppWidget

2015-09-10 22:45 459 查看
最近复习了下Appwidget的使用,做了个简单的案例

创建一个widget能够时时刷新时间,并能点击按钮实现代码的交互

知识梳理:

APPwidget是一个系统级服务,Appwidget在安装应用或页面启动会扫描系统所有已安装的Apk清单文件,发现清单中有AppWidgetProvider的子类会有响应

其中AppWidgetProvider并不是内容提供者,而是继承BroadCastReceiver

效果如图;

开发步骤

① 布局Layout

② 创建AppWidgetProvider

③ 配置<receiver

④  描述文件

布局

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="100dp"
android:background="#3366FF"
>
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="widget按钮" />
</RelativeLayout>


创建 一个类继承AppWidgetProvider

package com.itheima.appwidgett;

import android.appwidget.AppWidgetProvider;

public class MyAppWidgetReceiver extends AppWidgetProvider {

}


配置

<!-- 在清单文件配置widget -->
<receiver android:name="com.itheima.widget.receiver.MyWidagetReceiver" >
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/my_appwidget_info" />


描述文件

描述文件:创建一个xml ,并如下配置
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
android:initialLayout="@layout/view_appwidget"
android:minHeight="100dp"
android:minWidth="200dp"
android:previewImage="@drawable/biz_weight4x1"
android:resizeMode="horizontal|vertical"
android:updatePeriodMillis="1000" >
</appwidget-provider><!-- android:minWidth最小宽度 -->
<!-- minHeight最小高度 -->
<!-- updatePeriodMillis 86400000 毫秒 =24小时     每隔半小时   Service+Timer -->
<!-- previewImage预览图片 -->
<!-- resizeMode 拉伸 -->


创建一个服务

public class WidgetService extends Service {

private Timer timer;
private TimerTask timerTask;
@Override
public void onCreate() {
Log.i("wlz", "WidgetService---创建");
timer = new Timer();
timerTask = new TimerTask() {

@Override
public void run() {
//
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日  HH:mm:ss");
Date date = new Date();
String time = simpleDateFormat.format(date);
Log.i("wls", time);
RemoteViews remoteView=new RemoteViews("com.itheima.appwidgett", R.layout.view_appwidget);

//setTextViewText  实现 findViewById   setText
remoteView.setTextViewText(R.id.button1, time);

//PendingIntent:点击式的Intent
//  setOnClickPendingIntent          实现 findViewById setOnClick
Intent intent=new Intent();//widget点击事件让程序执行一段代码通过发送广播完成
intent.setAction("com.itheima.widget.action.UPDATE");
PendingIntent pIntent=PendingIntent.getBroadcast(getBaseContext(), 0, intent, 0);
remoteView.setOnClickPendingIntent(R.id.button1, pIntent);
//com.itheima.widget.receiver.MyWidagetReceiver
//				RemoteView:不是真正的View 用于进程间的对view操作。
ComponentName name=new ComponentName("com.itheima.appwidgett", "com.itheima.appwidgett.MyAppWidgetReceiver");
//刷新widget
AppWidgetManager.getInstance(getBaseContext()).updateAppWidget(name, remoteView);
//				AppWidgetManager.getInstance(getBaseContext()).updateAppWidget(更新的widget的类名,
}
};

timer.schedule(timerTask, 0, 1000);

}
@Override
public void onDestroy() {
Log.i("wlz", "WidgetService---销毁");
if(timer!=null)
{
timer.cancel();
timer=null;
}

}
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}

}


实现小部件调用代码需要用广播来处理

为什么使用到广播来处理事件?

点击是在桌面程序的widget是一个进程

处理代码却在 另外一个进程,只有广播与aidl可以跨进程使用。

创建一个广播测试widget通过广播实现与代码的交互

public class WidgetClickReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "AAAAAAAA", Toast.LENGTH_LONG).show();

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: