美文网首页Widget
widget的使用

widget的使用

作者: 小妖妖妖 | 来源:发表于2016-06-25 10:04 被阅读175次

    利用widget实现一个时钟功能小插件

    一般来说 widget 程序由以下部分组成:

    a. AppWidgetProvider 的实现

    b. widget外观布局定义文件

    c. widget 参数配置文件

    d.服务的实现

    e.androidManifest.xml文件配置

    a.写一个类继承AppWidgetProvider

    public class TonyAppWidgetProvider extends AppWidgetProvider {

    private final static String TAG = "TonyAppWidgetProvider";

    /**

    * 1:在xml文件中android:updatePeriodMillis="86400000"只能精确到分  不满足我们的要

    *:2:当我们用户每添加一个appwidget就会调用一次

    */

    @Override

    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {

    Log.e(TAG, "onUpdate");

    super.onUpdate(context, appWidgetManager, appWidgetIds);

    }

    /**

    * 在没有 appwidget  当用户初次添加appwidget的时候调用

    * 1:做一些初始化的工作

    * 2:打开数据库

    * 3:启动服务

    *

    */

    public void onEnabled(Context context) {

    super.onEnabled(context);

    Log.e(TAG, "onEnabled");

    Intent intent = new Intent(context, TonyAppWidgetService.class);

    context.startService(intent);

    }

    /**

    * 用户每删除一个appwidget就会调用一次

    */

    @Override

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

    Log.e(TAG, "onDeleted");

    super.onDeleted(context, appWidgetIds);

    }

    /**

    * 最后一个appwidget删除时调用

    */

    @Override

    public void onDisabled(Context context) {

    super.onDisabled(context);

    Log.e(TAG, "onDisabled");

    }

    }

    =================================================================

    b.widget外观布局定义文件,添加一个布局文件,文件取名为:tony_appwidget

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    android:orientation="vertical" >

    android:id="@+id/tv_time"

    android:layout_width="wrap_content"

    android:layout_height="wrap_content"

    android:textColor="@android:color/holo_red_light"

    android:text="TextView" />

    =========================================================================

    c. widget 参数配置文件

    建一个名为xml的文件夹,并且在此文件夹建一个.xml文件取名为tony_appwidget_info

    android:minWidth="294dp"

    android:minHeight="72dp"

    android:previewImage="@mipmap/ic_launcher"

    android:initialLayout="@layout/tony_appwidget"

    android:resizeMode="horizontal|vertical">

    android:minWidth="294dp"   appwidget最小的宽度

    android:minHeight="72dp"   appwidget最小的高度

    android:updatePeriodMillis="86400000"  appwidget 更新的时间 不能精确到秒  一般最小的精度是分

    问题:怎么控制更新的时间  ,代码中控制

    android:previewImage="@drawable/ic_launcher"  预览图片

    android:initialLayout="@layout/example_appwidget"  当我们添加一个appwidget时的布局

    当我们添加一个appwidget自动启动的Activity的名字

    android:configure="com.example.android.ExampleAppWidgetConfigure"

    重置appwidget的大小时的模式:表示可以水平 垂直拉伸

    android:resizeMode="horizontal|vertical">

    -->

    ======================================================================================================

    d.服务的实现

    创建一个文件TonyAppWidgetService继承Service

    public class TonyAppWidgetService extends Service {

    private AppWidgetManager am;

    //方式1:Handler + Runnable

    private Handler handler=new Handler();

    private Runnable runnable=new Runnable() {

    @Override

    public void run() {

    //获取系统的时间,并更新appwidget视图

    //RemoteView :不是当前应用的视图  属于其他的应用程序

    RemoteViews remoteViews=new RemoteViews(getPackageName(),R.layout.tony_appwidget);

    //获取当前时间

    String time=new Date().toLocaleString();

    //设置显示

    remoteViews.setTextViewText(R.id.tv_time,time);

    //随机改变字体的颜色

    Random rd = new Random();

    remoteViews.setTextColor(R.id.tv_time, Color.rgb(255, 255, rd.nextInt(256)));

    ComponentName componentName=new ComponentName(getApplicationContext(),TonyAppWidgetProvider.class);

    am.updateAppWidget(componentName,remoteViews);

    //点击  发送一个意图  PendingIntent  延迟意图

    Intent intent = new Intent(getApplicationContext(), MyNote.class);

    PendingIntent pendingIntent = PendingIntent.getActivity(getApplicationContext(), 100, intent, 0);

    remoteViews.setOnClickPendingIntent(R.id.tv_time, pendingIntent);

    handler.postDelayed(runnable,1000);

    }

    };

    public IBinder onBind(Intent intent) {

    return null;

    }

    public int onStartCommand(Intent intent, int flags, int startId) {

    am = AppWidgetManager.getInstance(this);

    handler.post(runnable);

    //启动定时器

    return super.onStartCommand(intent, flags, startId);

    }

    }

    =======================================================================================================

    e.配置androidManifest.xml文件

    android:name="android.appwidget.provider"

    android:resource="@xml/tony_appwidget_info" />

    相关文章

      网友评论

        本文标题:widget的使用

        本文链接:https://www.haomeiwen.com/subject/mocadttx.html