您的位置:首页 > 其它

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

2016-06-17 16:13 405 查看
利用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

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    android:orientation="vertical" >

    <TextView

        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" />

</LinearLayout>

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

c. widget 参数配置文件 

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

<?xml version="1.0" encoding="utf-8"?>

<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"

    android:minWidth="294dp"

    android:minHeight="72dp"

    android:previewImage="@mipmap/ic_launcher"

    android:initialLayout="@layout/tony_appwidget"

    android:resizeMode="horizontal|vertical">

</appwidget-provider>

    <!--

        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文件

        <receiver android:name=".TonyAppWidgetProvider" >

            <intent-filter >

                <!-- 意图 要去哪里 -->

                <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />

            </intent-filter>

            <!-- 去哪里的时候要携带的数据 -->

            <meta-data

                android:name="android.appwidget.provider"

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

        </receiver>

        <service android:name="com.xiaoyao.android.mynote.TonyAppWidgetService"></service>
 
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: