android基础---->WidGet的使用

  Widget是一个可以添加在别的应用程序中的”小部件”,我们可以使用自定义的Widget远程控制我们的程序做一些事情。一般用于在桌面上添加一个小部件,现在我们开始小部件的学习。

目录导航:

  1. WidGet的简要说明
  2. WidGet的实例代码
  3. 友情链接

WidGet的简要说明

一、 WidGet的特点:

  • 轻量:它们一般都很小,在终端上嵌入非常方便,运行快速。
  • 形式多:Widget可以以多种形式呈现出来,幻灯秀、视频、地图、新闻、小游戏等等
  • 功能巨:别看它们小,却服务周到,它可以为你报告新闻,天气预报网站,Widget会将信息主动带给你
  • 个性化:Widget更像一个属于我们每个人的魔方,任由用户聚合

二、 WidGet的使用步骤:

  • 绘制小组件的布局:在layout中创建一个布局文件
  • 配置widget的基本属性:创建一个资源文件夹,添加一个widget属性的配置xml文件
  • 定义AppWidgetProvider:创建一个继承AppWidgetProvider的java类
  • 提供Configuration Activity:可以在MainActiviy中使用

WidGet的实例代码

按照上述所说,我们开始WidGet的实例说明:

一、 在layout中创建一个WidGet的布局文件:widget.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#09C"
android:padding="@dimen/widget_margin">

<TextView
    android:id="@+id/appwidget_text"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerHorizontal="true"
    android:layout_centerVertical="true"
    android:layout_margin="8dp"
    android:background="#09C"
    android:contentDescription="@string/appwidget_text"
    android:text="@string/appwidget_text"
    android:textColor="#ffffff"
    android:textSize="24sp"
    android:textStyle="bold|italic" />
</RelativeLayout>

二、 创建一个资源文件夹xml,添加一个widget属性的配置xml文件:widget_info.xml

<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
    android:configure="com.example.linux.listviewtest.MainActivity"
    android:initialKeyguardLayout="@layout/widget"
    android:initialLayout="@layout/widget"
    android:minHeight="40dp"
    android:minWidth="250dp"
    android:previewImage="@drawable/example_appwidget_preview"
    android:resizeMode="horizontal|vertical"
    android:updatePeriodMillis="86400000"
    android:widgetCategory="home_screen">
</appwidget-provider>

三、 创建一个继承AppWidgetProvider的java类:widget

package xml;

import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import android.widget.Toast;

import com.example.linux.listviewtest.TimerService;

/**
 * writer: huhx
 * Implementation of App Widget functionality.
 */
public class widget extends AppWidgetProvider {
    private final static String TAG = "WidGetTest";

    public widget() {
        Log.i(TAG, "widget constructor.");
    }

    // 当一个或多个小组件的实例被删除时调用
    @Override
    public void onDeleted(Context context, int[] appWidgetIds) {
        Log.i(TAG, "on deleted");
        super.onDeleted(context, appWidgetIds);
    }

    // 当最后一个这样的小组件被删除
    @Override
    public void onDisabled(Context context) {
        super.onDisabled(context);
        Log.i(TAG, "on disable");
        context.stopService(new Intent(context, TimerService.class));
    }

    // 当这样的小组件被初始化时,也就是当小组件被拖到桌面
    @Override
    public void onEnabled(Context context) {
        super.onEnabled(context);
        Log.i(TAG, "on enable");
        context.startService(new Intent(context, TimerService.class));
    }

    // to dispatch calls to the various other methods on AppWidgetProvider.
    @Override
    public void onReceive(Context context, Intent intent) {
        Log.i(TAG, "on receive");
        super.onReceive(context, intent);
    }

    // 小组件的更新
    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
        super.onUpdate(context, appWidgetManager, appWidgetIds);
    }
}

四、 创建一个更新时间的服务类:TimerService

package com.example.linux.listviewtest;

import android.app.Service;
import android.appwidget.AppWidgetManager;
import android.content.ComponentName;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;
import android.widget.RemoteViews;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
import xml.widget;

public class TimerService extends Service {
    private final static String TAG = "WidGetTest";
    private Timer timer;
    private SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    public TimerService() {
        Log.i(TAG, "timer service constructor");
    }

    @Override
    public IBinder onBind(Intent intent) {
        Log.i(TAG, "on bind");
        return null;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        Log.i(TAG, "on create");
        timer = new Timer();
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                updateViews();
            }
        }, 0, 1000);
    }

    private void updateViews() {
        Log.i(TAG, "update views");
        String time = simpleDateFormat.format(new Date());
        RemoteViews remoteViews = new RemoteViews(getPackageName(), R.layout.widget);
        remoteViews.setTextViewText(R.id.appwidget_text, time);
        AppWidgetManager manager = AppWidgetManager.getInstance(getApplicationContext());
        ComponentName name = new ComponentName(getApplicationContext(), widget.class);
        manager.updateAppWidget(name, remoteViews);
    }
    @Override
    public void onDestroy() {
        super.onDestroy();
        timer = null;
    }
}

五、 在AndroidManifest.xml中,注册服务和接收器:

<activity android:name=".MainActivity">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

<service
    android:name=".TimerService"
    android:enabled="true"
    android:exported="true" />

<receiver android:name="xml.widget">
    <intent-filter>
        <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
    </intent-filter>
    <meta-data
        android:name="android.appwidget.provider"
        android:resource="@xml/widget_info" />
</receiver>

六、 在MainActivity中使用:

package com.example.linux.listviewtest;

import android.appwidget.AppWidgetManager;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;

public class MainActivity extends AppCompatActivity {
    private final static String TAG = "WidGetTest";
    int mAppWidgetId;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.i(TAG, " on main create ... ");

        setResult(RESULT_CANCELED);

        // Find the widget id from the intent.
        Intent intent = getIntent();
        Bundle extras = intent.getExtras();
        if (extras != null) {
            mAppWidgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID,
                    AppWidgetManager.INVALID_APPWIDGET_ID);
        }

        // If they gave us an intent without the widget id, just bail.
        if (mAppWidgetId == AppWidgetManager.INVALID_APPWIDGET_ID) {
            finish();
        }

        // return OK
        Intent resultValue = new Intent();
        resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, mAppWidgetId);

        setResult(RESULT_OK, resultValue);
        finish();
    }
}

七、 运行效果如下截图以及打印的日志如下:

  • 第一次拖到桌面,打印如下:
03-26 09:21:03.138 27090-27090/com.example.linux.listviewtest I/WidGetTest: widget constructor.
03-26 09:21:03.140 27090-27090/com.example.linux.listviewtest I/WidGetTest: on receive
03-26 09:21:03.140 27090-27090/com.example.linux.listviewtest I/WidGetTest: on enable
03-26 09:21:03.156 27090-27090/com.example.linux.listviewtest I/WidGetTest: timer service constructor
03-26 09:21:03.156 27090-27090/com.example.linux.listviewtest I/WidGetTest: on create
03-26 09:21:03.161 27090-27090/com.example.linux.listviewtest I/WidGetTest: widget constructor.
03-26 09:21:03.161 27090-27090/com.example.linux.listviewtest I/WidGetTest: on receive
03-26 09:21:03.173 27090-27483/com.example.linux.listviewtest I/WidGetTest: update views
03-26 09:21:03.198 27090-27090/com.example.linux.listviewtest I/WidGetTest:  on main create ...
03-26 09:21:03.237 27090-27090/com.example.linux.listviewtest I/WidGetTest: widget constructor.
03-26 09:21:03.237 27090-27090/com.example.linux.listviewtest I/WidGetTest: on receive
03-26 09:21:04.173 27090-27483/com.example.linux.listviewtest I/WidGetTest: update views
03-26 09:21:05.214 27090-27483/com.example.linux.listviewtest I/WidGetTest: update views.......
  • 当把它移除,此时桌面没有小组件,打印日志如下:
03-26 09:24:10.719 30093-30093/com.example.linux.listviewtest I/WidGetTest: widget constructor.
03-26 09:24:10.719 30093-30093/com.example.linux.listviewtest I/WidGetTest: on receive
03-26 09:24:10.719 30093-30093/com.example.linux.listviewtest I/WidGetTest: on deleted
03-26 09:24:10.765 30093-30093/com.example.linux.listviewtest I/WidGetTest: widget constructor.
03-26 09:24:10.765 30093-30093/com.example.linux.listviewtest I/WidGetTest: on receive
03-26 09:24:10.766 30093-30093/com.example.linux.listviewtest I/WidGetTest: on disable

友情链接

时间: 2024-11-05 18:47:23

android基础---->WidGet的使用的相关文章

Android基础入门教程——4.2.3 Service精通

Android基础入门教程--4.2.3 Service精通 标签(空格分隔): Android基础入门教程 本节引言: 本节,我们继续来研究Service(服务)组件,本节将会学习下Android中的AIDL跨进程通信的一些 概念,并不深入到源码层次,暂时知道是什么,会用即可!开始本节内容~ 本节对应官方文档:Binder 1.Binder机制初涉 1)IBinder和Binder是什么鬼? 我们来看看官方文档怎么说: 中文翻译: IBinder是远程对象的基本接口,是饿了高性能而设计的轻量级

android基础之点击监听器的2种监听实现

点击监听器接口:onClickListener 抽象函数 onClick(View v) 有2个方法实现监听: 1:当前类继承点击监听器接口 package com.example.button; import android.app.Activity; import android.os.Bundle; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; im

Android基础入门教程——2.3.7 ProgressBar(进度条)

Android基础入门教程--2.3.7 ProgressBar(进度条) 标签(空格分隔): Android基础入门教程 本节引言: 本节给大家带来的是Android基本UI控件中的ProgressBar(进度条),ProgressBar的应用场景很多,比如 用户登录时,后台在发请求,以及等待服务器返回信息,这个时候会用到进度条:或者当在进行一些比较 耗时的操作,需要等待一段较长的时间,这个时候如果没有提示,用户可能会以为程序Carsh或者手机死机 了,这样会大大降低用户体验,所以在需要进行耗

Android基础知识(1)——UI编程

我学习android一段时间了,看着大牛们的各种神博客,心里也痒痒的,希望有一天也能成为他们一样. 我知道,这些都是一滴一滴的积累,所有我也需要找到我的学习方法,打好基础,做出属于我自己的成果. 当然,作为一名菜鸟程序员,更加要懂得把知识整理归类,方便记忆. ----------------------------------------------------------- 在学校里听老师讲课,总会让学生误会程序员的主要工作不是界面美化,那都是美工做得事情.但随着移动开发的不断发展,在软件开发

Android基础入门教程——10.14 Android GPS初涉

Android基础入门教程--10.14 Android GPS初涉 标签(空格分隔): Android基础入门教程 本节引言: 说到GPS这个名词,相信大家都不陌生,GPS全球定位技术嘛,嗯,Android中定位的方式 一般有这四种:GPS定位,WIFI定准,基站定位,AGPS定位(基站+GPS): 本系列教程只讲解GPS定位的基本使用!GPS是通过与卫星交互来获取设备当前的经纬度,准确 度较高,但也有一些缺点,最大的缺点就是:室内几乎无法使用-需要收到4颗卫星或以上 信号才能保证GPS的准确

Android基础入门教程——2.3.1 TextView(文本框)详解

Android基础入门教程--2.3.1 TextView(文本框)详解 标签(空格分隔): Android基础入门教程 本节引言: 学习完Android中的六大布局,从本节开始我们来一个个讲解Android中的UI控件,本节给大家带来的UI控件是:TextView(文本框),用于显示文本的一个控件,另外声明一点,我不是翻译API文档,不会一个个属性的去扣,只学实际开发中常用的,有用的,大家遇到感觉到陌生的属性可以查询对应的API!当然,每一节开始都会贴这一节对应API文档的链接:TextVie

Android基础入门教程——3.1 基于监听的事件处理机制

Android基础入门教程--3.1.1 基于监听的事件处理机制 标签(空格分隔): Android基础入门教程 本节引言: 第二章我们学习的是Android的UI控件,我们可以利用这些控件构成一个精美的界面,但是仅仅是界面而已:下一步就要开始学习逻辑与业务实现了,本章节讲解的是Android的事件处理机制!何为事件处理机制?举个 简单的例子,比如点击一个按钮,我们向服务器发送登陆请求!当然,Android中的事件处理机制不止这一种, 比如屏幕发生选择,我们点击了屏幕上某个区域-简单点说,事件处

android基础 sqlite listview activity返回值

android基础  sqlite listview activity返回值 [1].[代码] [Java]代码 跳至 [1] [2] ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63

Android基础知识【项目实训】【3】

[该项目实训是Android基础知识的一个综合练习,特别提示:项目中会用到一些图片素材,都是随意整理的,稍后会上传一个资源,包含该事项项目的基本功能,也含有图片素材] [项目题目]:校园订餐App设计 综合案例 [目标] 欢迎界面过后,应该显示app的主界面了,根据[UI设计指导]中的规划,主界面采用上下两级标签导航.这部分是app开发中比较麻烦的一块. 1.先来看一下,最终的效果吧,这样做起来比较有底: 默认显示的主界面,下部是主导航,上面是二级导航,默认打开的是"促销打折"这一版面