Android UI 구성 요소 AppWidget 컨트롤 입문 상세 설명

Widget 도입 
위 젯 은 데스크 톱 에 놓 인 작은 구성 요소(마 운 트)로 이해 할 수 있 습 니 다.위 젯 이 있 으 면 음악 을 재생 하 는 등 데스크 톱 에서 다양한 작업 을 편리 하 게 할 수 있 습 니 다. 
데스크 톱 을 길 게 누 르 면 위 젯 옵션 을 볼 수 있 습 니 다.아래 그림 과 같 습 니 다. 

위의 그림 에서 화살표 에 있 는 widgets 아이콘 을 누 르 면 다음 화면 이 나타 납 니 다.(모두 widget) 

위의 그림 의 임의의 widget 을 길 게 누 르 면 데스크 톱 에 올 릴 수 있 습 니 다. 
Widget 사용
Widget 의 실현 방향 
(1)Android Manifest 에서 AppWidget 을 성명 합 니 다. 
(2)xml 디 렉 터 리 에서 AppWidget 의 설정 파일 을 정의 합 니 다. 
(3)layot 디 렉 터 리 에서 Widget 의 레이아웃 파일 을 정의 합 니 다. 
(4)새로운 클래스 를 만 들 고 AppWidget Provider 클래스 를 계승 하여 구체 적 인 widget 업무 논 리 를 실현 합 니 다. 
AppWidgetProvider 를 계승 하기 위해 서 는 새로운 클래스 가 필요 합 니 다.앱 위 젯 프로 바 이 더 를 눌 러 보 니 앱 위 젯 프로 바 이 더 가 브 로드 캐 스 트 Receiver 에서 계승 되 었 습 니 다. 
왜 Widget 은 라디오 수신 기인 가요?브 로드 캐 스 트 Receiver 클래스 에 서 는 라디오 를 받 을 수 있 는 onReceive 방법 이 있다 는 것 을 알 고 있 습 니 다.우리 가 데스크 톱 마 운 트 에서 작업 을 할 때 반드시 응용 변 화 를 일 으 킬 것 이다.이것 은 마 운 트 와 응용 간 의 통신 과 관련 되 는데 이때 방송 으로 통신 하 는 것 이 더 할 나 위 없 이 좋다. 
Widget 의 구체 적 인 사용 절차 
(1)TestWidget.java 클래스 를 새로 만 들 고 AppWidget Provider 를 계승 합 니 다.
 TestWidget.java: 

import android.appwidget.AppWidgetProvider;
import android.content.Context;
import android.content.Intent;
/**
 * Created by smyhvae on 2016/9/7.
 */
public class TestWidget extends AppWidgetProvider{
 @Override
 public void onReceive(Context context, Intent intent) {
  super.onReceive(context, intent);
 }
} 
(2)Widget 은 라디오 수신 기 이기 때문에 목록 파일 에 등록 해 야 합 니 다.

 <!--   widget   AppWidgetProvider -->
  <receiver android:name=".TestWidget">
   <intent-filter>
    <action android:name="android.appwidget.action.APPWIDGET_UPDATE"/>
   </intent-filter>
   <meta-data
    android:name="android.appwidget.provider"
    android:resource="@layout/widget_setting"/>
  </receiver> 
04 줄:action 은 여과 조건 으로 행 위 를 걸 러 내 고 widget 의 업 데 이 트 를 모니터링 합 니 다.
08 줄:android:resource 에서 widget 설정 을 지 정 했 습 니 다.우 리 는 속성 이 목록 파일 에 데 이 터 를 저장 하 는 데 쓰 인 다 는 것 을 안다. 
(3)layot 폴 더 에 새 파일 widgetsetting.xml:(widget 설정 파일)
 setting_widget.xml: 

<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:initialLayout="@layout/layout_widget"
     android:minHeight="140dp"
     android:minWidth="140dp"
     android:previewImage="@mipmap/ic_launcher"
     android:updatePeriodMillis="20000"
     android:widgetCategory="home_screen"
 >
</appwidget-provider> 
08 줄:android:initialLayout 에서 widget 의 레이아웃 을 지 정 했 습 니 다.
09 줄:android:updatePeriodMillis 가 업데이트 시간 주 기 를 지정 합 니 다.
10 줄:android:widgetCategory="homescreen"widget 을 메 인 화면 에 표시 합 니 다.(잠 금 화면 에 도 표시 할 수 있 습 니 다)
(4)layot 폴 더 에 새 파일 layotwidget.xml:(widget 레이아웃)
 layout_widget.xml: 

<?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/textView"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:layout_gravity="center_horizontal"
  android:text="Large Text"
  android:textAppearance="?android:attr/textAppearanceLarge"/>
 <Button
  android:id="@+id/button2"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:layout_gravity="center_horizontal"
  android:text="New Button"/>
</LinearLayout> 
여기까지 하면 프로그램 이 달 릴 수 있다.프로그램 을 실행 한 후 데스크 톱 을 길 게 누 르 고"Widget"단 추 를 누 르 면 우리 가 방금 디자인 한 widget 을 볼 수 있 습 니 다. 

위의 그림 의 화살 표를 길 게 누 르 면 우리 가 디자인 한 widget 을 데스크 톱 에 끌 어 다 놓 을 수 있 습 니 다. 

Widget 의 클릭 과 업데이트[중요] 
TestWidget.java 는 AppWidget Provider 로부터 계승 되 었 고,AppWidget Provider 는 BroadcastReceiver 를 계승 한 후 onReceiver 방법 을 다시 쓰 고 여러 가지 방법 을 사용자 정의 한 것 을 알 고 있 습 니 다. 

위의 그림 에는 삭제 되 었 을 때,비활성화 되 었 을 때,활성화 되 었 을 때,업데이트 되 었 을 때 등 여러 가지 방법 이 포함 되 어 있다.특히 중요 한 것 은 onReceive()방법 과 onUpDate()방법 이다.
 작은 위 젯 이 바 뀌 었 을 때(예 를 들 어 데스크 톱 에 설치 되 었 을 때)시스템 은 업 데 이 트 된 방송 을 보 냅 니 다(위의 빨 간 상자 부분 참조).저 희 는 settingwidget.xml 에 widget 의 업데이트 주파 수 를 설정 하 였 습 니 다.이것 도 업 데 이 트 를 호출 합 니 다. 
내 가 켜 면 날씨 등 widget 이 왜 업데이트 되 지 않 느 냐 고 물 을 수도 있다.프로 세 스 가 죽 었 기 때 문 입 니 다.이 컨트롤 을 먼저 제거 한 다음 에 설치 할 수 밖 에 없습니다.이 때 응용 프로그램 은 update 업데이트 방송 을 보 냅 니 다. 
widget 의 클릭 과 업 데 이 트 를 해 야 할 때,우 리 는 onUpdate()방법 을 다시 써 서 방송 을 보 내야 합 니 다.프로그램 이 초기 화 될 때 시스템 은 onUpdate()방법 을 호출 합 니 다. 
onUpdate()방법의 코드 는 다음 과 같 습 니 다.

  @Override
 public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
  super.onUpdate(context, appWidgetManager, appWidgetIds);
  RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.layout_widget);//      RemoteViews
  Intent intent = new Intent();
  intent.setClass(context, TestWidget.class); //  intent     TestWidget  ,TestWidget       ,   。。        // 。
  intent.setAction(WIDGET_BTN_ACTION);
  PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
  remoteViews.setOnClickPendingIntent(R.id.widget_btn, pendingIntent);//  btn_widget     :     ,     action   。
  appWidgetManager.updateAppWidget(appWidgetIds, remoteViews); //      ,      。
 } 
코드 설명:
먼저 new 하나의 RemoteViews 가 필요 합 니 다.구조 방법 에서 두 개의 인 자 를 전달 해 야 합 니 다.하 나 는 가방 이름(context.getPacakgeName)이 고 하 나 는 레이아웃 파일(layotwidget)。
 그리고 reoteViews.setOnClickPendingIntent()설정 단 추 를 통 해 이 벤트 를 클릭 합 니 다.setOnClickPendingIntent()에서 두 개의 인 자 를 전달 해 야 합 니 다.하 나 는 id(예 를 들 어 클릭 해 야 하 는 button)이 고 하 나 는 PendingIntent 입 니 다.PendingIntent 는 미래의 의도 입 니 다.
 그래서 우 리 는 PendingIntent 를 미리 구성 해 야 한다.이것 은 PendingIntent.getBroadcast()를 통 해 구성 해 야 한다.getBroadcast()방법 중 하 나 는 Intent 입 니 다.
 그래서 우 리 는 Intent 를 만들어 야 한다.intent 에서 라디오 를 보 내 고 Action 을 설정 합 니 다.
 단 추 를 눌 렀 을 때 appWidgetManager.updateAppWidget(int[]appWidgetIds,RemoteViews views)방법 으로 업데이트 하 십시오.첫 번 째 매개 변 수 는 onUpdate 방법의 매개 변수 입 니 다.모든 컨트롤 을 대표 합 니 다. 
onUpdate()방법 에서 intent 를 통 해 단 추 를 누 르 고 시간 을 누 르 는 방송 을 보 낸 후에 우 리 는 onReceive()방법 에서 방송 을 받 아야 합 니 다.
 onReceive()방법의 코드 는 다음 과 같 습 니 다. 

 @Override
 public void onReceive(Context context, Intent intent) {
  super.onReceive(context, intent);
  if (intent != null && TextUtils.equals(intent.getAction(), WIDGET_BTN_ACTION)) { // intent   , action     ,     ,        
   Log.i(WIDGET_BTN_ACTION, "is clicked");
   //               
   RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.layout_widget);//  :  【  】    RemoteViews
   remoteViews.setTextViewText(R.id.widget_tv, "be clicked");
   remoteViews.setTextColor(R.id.widget_tv, Color.RED);
   AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);//     
   ComponentName componentName = new ComponentName(context, TestWidget.class);
   appWidgetManager.updateAppWidget(componentName, remoteViews);//setText  ,      
  }
 } 
코드 설명:
 intent 의 action 이 성공 적 으로 일치 할 때 클릭 시간 후의 setText 를 실행 하기 시 작 했 습 니 다.그러나 여기 서 는 onUpdate()방법 중의 RemoteViews 를 공유 할 수 없습니다.(이것 은 매우 큰 구덩이 입 니 다.)
 이벤트 클릭 후의 setText 를 실행 한 후,app WidgetManager.updateAppWidget(ComponentName,RemoteViews)방법 을 호출 하 십시오.첫 번 째 매개 변 수 는 구성 요소 이름 입 니 다.우리 스스로 new 를 사용 해 야 합 니 다.두 번 째 매개 변 수 는 설명 하기 쉽 습 니 다. 
종합 적 으로 말 하면 TestWidget.java 의 전체 버 전 코드 는 다음 과 같 습 니 다.
Testwidget.java:

 import android.app.PendingIntent;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.text.TextUtils;
import android.util.Log;
import android.widget.RemoteViews;
/**
 * Created by smyhvae on 2016/9/7.
 */
public class TestWidget extends AppWidgetProvider {
 public static final String WIDGET_BTN_ACTION = "widget_btn_action";
 @Override
 public void onReceive(Context context, Intent intent) {
  super.onReceive(context, intent);
  if (intent != null && TextUtils.equals(intent.getAction(), WIDGET_BTN_ACTION)) { // intent   , action     ,     ,        
   Log.i(WIDGET_BTN_ACTION, "is clicked");
   //               
   RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.layout_widget);//  :  【  】    RemoteViews
   remoteViews.setTextViewText(R.id.widget_tv, "be clicked");
   remoteViews.setTextColor(R.id.widget_tv, Color.RED);
   AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);//     
   ComponentName componentName = new ComponentName(context, TestWidget.class);
   appWidgetManager.updateAppWidget(componentName, remoteViews);//setText  ,      
  }
 }
 @Override
 public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
  super.onUpdate(context, appWidgetManager, appWidgetIds);
  RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.layout_widget);//      RemoteViews
  Intent intent = new Intent();
  intent.setClass(context, TestWidget.class); //  intent     TestWidget  ,TestWidget       ,   。。        // 。
  intent.setAction(WIDGET_BTN_ACTION);
  PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
  remoteViews.setOnClickPendingIntent(R.id.widget_btn, pendingIntent);//  btn_widget     :     ,     action   。
  appWidgetManager.updateAppWidget(appWidgetIds, remoteViews); //      ,      。
 }
} 
실행 후 widget 을 데스크 톱 으로 끌 어 올 립 니 다.효 과 는 다음 과 같 습 니 다.
 
버튼 을 누 르 면 효과 가 다음 과 같 습 니 다.
 
프로젝트 파일:(Android Studio 2.1) 
물론 widget 은 다른 용도 도 많 습 니 다.예 를 들 면:
 •서비스 와 통신 하 다
 •widget 컨트롤 의 대화 방법.
 •데스크 톱 재생 기 위 젯 만 들 기
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기