+3

Tìm hiểu về widget trong android

1. Widget trong android là gì?

Widget trong android là một tiện ích nhỏ thường được đặt trên home screen. Nó rất tiện dụng bởi nó cho phép người dùng đặt các ứng dụng yêu thích của họ lên home screen và truy cập sử dụng chúng một cách nhanh chóng. Trong device của mình bạn có thể tìm được các widget tồn tại sẵn như widget về music, thời tiết, đồng hồ, báo thức,.... Mặc dù tiện dụng nhưng nó cũng có những yếu điểm của nó. Bởi nó cũng là một ứng dụng nên nó sẽ tốn Ram. Càng nhiều widget trên home screen bạn sẽ càng có ít dung lượng Ram sử dụng đi. Có nhiều widget còn sử dụng kết nối tới server riêng hoặc facebook, yahoo, ... vậy nên sẽ tốn lưu lượng sử dụng của bạn. Chính vì vậy mà nhiều khi bạn sẽ thắc mắc sao chả dùng cái quái gì mà lưu lượng cũng bị hao nghĩa là sao?

Vậy nên mỗi khi sử dụng widget bạn nên cân nhắc về tính cần thiết và tiện dụng của nó trước khi sử dụng.

2. Làm sao để tạo một ứng dụng widget

Để tạo ra ứng dụng widget thì cái trước tiên chúng ta cần là một đối tượng AppWidgetProviderInfo nơi mà bạn sẽ định nghĩa một file xml widget riêng biệt. Vậy ta sẽ tạo một folder là xml trong thư mục res. Tạo một file xml mới trong thư mục xml vừa tạo và set type của xml tới AppWidgetProviderInfor như sau:

<appwidget-provider
   xmlns:android="http://schemas.android.com/apk/res/android"
   android:minWidth="250dp"
   android:updatePeriodMillis="0"
   android:minHeight="250dp"
   android:initialLayout="@layout/activity_main">
</appwidget-provider>

Sau đó bạn hãy tạo các layout cho widget của bạn tới activity_main.xml

Với các class java: Sau khi đã design các layout cho widget, tạo một class .java và extend AppWidgetProvider. Trong @Override update method cần xác định rõ 2 class PendingIntent và RemoteViews:

PendingIntent pending = PendingIntent.getActivity(context, 0, intent, 0);
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.activity_main);

Cuối cùng phải gọi method updateAppWidget() của class AppWidgetManager.

appWidgetManager.updateAppWidget(currentWidgetId,views);

Dưới đây là một số các method khác đã được định nghĩa trong class này:

onDeleted(Context context, int[] appWidgetIds): Gọi khi instance của AppWidgetProvider được delete.

onDisabled(Context context): Gọi khi instance cuối cùng của AppWidgetProvider được delete.

onEnabled(Context context): Gọi khi một instance của AppwidgetProvider được tạo.

onReceive(Context context, Intent intent): Nó được sử dụng để gửi các cuộc gọi đến các phương pháp khác nhau của lớp.

Về file AndroidManifest.xml ta có ví dụ:

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

3. Ví dụ

Ví dụ sau đây mục đích giúp hiểu hơn về cách tạo, sử dụng một widget trong android. Ứng dụng này sẽ thực hiện hiển thị một button, nếu người dùng click vào button đó thì sẽ mở trình duyệt tới url: https://viblo.asia/

Tạo một project android với android studio: Screenshot from 2015-10-26 08:14:27.png Tại file MainActivity.java:

 package com.framgia.widgetandroidreport;

 import android.app.PendingIntent;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.widget.RemoteViews;
import android.widget.Toast;

 public class MainActivity extends AppWidgetProvider {
    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
        super.onUpdate(context, appWidgetManager, appWidgetIds);
        for (int i = 0; i < appWidgetIds.length; i++) {
            int currentWidgetId = appWidgetIds[i];
            String url = "https://viblo.asia/";
            Intent intent = new Intent(Intent.ACTION_VIEW);
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            intent.setData(Uri.parse(url));
            PendingIntent pending = PendingIntent.getActivity(context, 0, intent, 0);
            RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.activity_main);
            views.setOnClickPendingIntent(R.id.button, pending);
            appWidgetManager.updateAppWidget(currentWidgetId, views);
            Toast.makeText(context, "widget added", Toast.LENGTH_SHORT).show();
        }
    }
}

Sửa file activity_main.xml như sau:

 <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="match_parent"
                tools:context=".MainActivity">

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:text="Submit"/>
</RelativeLayout>

Sửa tiếp file res/xml/widget.xml.

<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:initialLayout="@layout/activity_main"
    android:minHeight="150dp"
    android:minWidth="150dp"
    android:updatePeriodMillis="0">
</appwidget-provider>

Cuối cùng là file AndroidManifest.xml:

 <?xml version="1.0" encoding="utf-8"?>
 <manifest
    package="com.framgia.widgetandroidreport"
    xmlns:android="http://schemas.android.com/apk/res/android">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme">
        <receiver android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.appwidget.action.APPWIDGET_UPDATE"></action>
            </intent-filter>
            <meta-data
                android:name="android.appwidget.provider"
                android:resource="@xml/widget"></meta-data>
        </receiver>

    </application>

 </manifest>

Sau khi hiểu về cách dùng widget, nếu có thời gian bạn có thể tạo một widget về thời tiết, facebook, tin tức, báo thức ...và rất nhiều các widget hữu ích khác.

Dưới đây là link download project và file apk: https://drive.google.com/file/d/0B7td9WR1ZtQ0bHZKYTdzVmg0QU0/view?usp=sharing

Chú ý là sau khi cài đặt app bạn phải vào phần quản lý widget của máy và cho phép nó ra màn hình home screen nhé.

Cảm ơn bạn đã đọc bài viết.


All Rights Reserved

Viblo
Let's register a Viblo Account to get more interesting posts.