Android 학습 10-----Android 구성 요소 통신(8)데스크 톱 디 스 플레이 구성 요소:AppWidget

11424 단어 androidappwidget

AppWidget
안 드 로 이 드 폰 을 사용 할 때 사용 자 는 자주 사용 하 는 소프트웨어 를 데스크 톱 에 끌 어 다 놓 아 조작 하기 편리 하 게 한다.이 때 는 AppWidget 구성 요 소 를 사용 해 야 합 니 다.android.apwidget 패키지 에서 5 개의 핵심 동작 류 를 종합 합 니 다.
No.
클래스 이름
묘사 하 다.
1
AppWidgetProvider
AppWidget 의 기본 동작 을 정 의 했 습 니 다.하위 클래스 를 통 해 설정 해 야 합 니 다.
2
AppWidgetProviderInfo
구성 요소 의 크기,업데이트 시간 등 AppWidget 구성 요소 의 메타 데이터 공급 자
3
AppWidgetHostView
AppWidget 의 View 디 스 플레이 를 만 듭 니 다.이것 은 진정한 View 이 고 이에 대응 하 는 RemoteView 도 있 습 니 다.
4
AppWidgetHost
AppWidget 의 서 비 스 를 감청 하고 AppWidgetHostView 를 만 듭 니 다.
5
AppWidgetManager
해당 AppWidget 업데이트 에 사용
AppWidget 은 데스크 톱 에 화면 을 표시 해 야 하기 때문에 이 화면 은 AppWidgetManager 프로그램 을 통 해 제어 해 야 하기 때문에 android.widget.RemoveViews 류 를 사용 해 야 합 니 다.이러한 주요 기능 은 View 의 디 스 플레이 실 체 를 설명 하 는 것 입 니 다.RemoveViews 는 프로 세 스 간 통신 체 제 를 통 해 AppWidgetHost 를 전달 합 니 다.
이 RemoteViews 는 하나의 프로 세 스 의 컨트롤 을 다른 프로 세 스에 삽입 하여 표시 하 는 방법 일 뿐 입 니 다.모든 이벤트 처리 작업 은 원본 프로 세 스에 있 습 니 다.AppWidget 은 RemoveViews 에 의 해 디 스 플레이 내용 의 업데이트 작업 을 완성 해 야 합 니 다.RemoveViews 는 자주 사용 하 는 방법 이 있 습 니 다.
No.
방법.
묘사 하 다.
1
Public RemoteViews(String packageName,int layoutId)
새 RemoveViews 구성 요 소 를 만 들 고 필요 한 레이아웃 관리자 파일 을 지정 합 니 다.
2
Public void addView(int viewId,RemoteViews nestedView)
RemoveViews 에 구성 요 소 를 추가 합 니 다.
3
Public void setXxx(int viewId,String methodName,Xxx value)
setBoolean(),setImageViewResource(),setTextViewText()등 지정 한 내용 을 설정 합 니 다.
4
Public void setOnClickPendingIntent(int viewId,PendingIntent pendingIntent)
이벤트 실행 을 눌 렀 을 때 동작 할 PendingIntent 대상 설정
5
Public void setProgressBar(int viewId,int max,int progress,Boolean indeterminate)
동작 할 ProgressBar 구성 요소 설정
RemoveViews 클래스 를 원 격 View 로 제외 하고 Activity 프로그램 에서 도 RemoveView 구성 요소 의 동작 에 대응 하 는 AppWidgetProvider 클래스 를 제공 합 니 다.문 서 를 통 해 AppWidgetProvider 는 BroadcastReceiver 의 하위 클래스 임 을 알 수 있 기 때문에 사용 할 때 AndroidManifest.xml 에 receive 노드 를 설정 해 야 합 니 다.AppWidgetProvider 클래스 에서 도 Activity 클래스 의 생명주기 제어 방법 을 제 공 했 는데 그 방법 은 다음 과 같다.
No.
방법.
묘사 하 다.
1
Public void onDeleted(Context context,int[] appWidget)
AppWidget 삭제 시 터치
2
Public void onDisabled(Context context)
마지막 AppWidget 삭제 시 터치
3
Public void onEnabled(Context context)
첫 번 째 AppWidget 시작 시 터치
4
Public void onReceive(Context context,Intent intent)
방송 이벤트 수락
5
Public void onUpdate(Context context, AppWidgetManager appWidgetManger, int[] appWidgetIds)
지정 한 업데이트 시간 이 도착 하거나 사용자 가 AppWidget 을 추가 할 때 터치 합 니 다.
주:
1.onUpdate 방법 은 AppWidget 구성 요소 의 디 스 플레이 기능 과 원 격 AppWidget 의 이벤트 처리 바 인 딩 을 결정 합 니 다.구성 요소 가 업데이트 되 었 을 때 AppWidgetManager 류 를 사용 하여 원 격 AppWidget 구성 요소(엄 밀 히 말 하면 RemoveViews)를 업데이트 해 야 합 니 다.AppWidgetManager 는 Action 이름 을'android.apwidget.action.APWIDGET'이 라 고 방송 합 니 다.UPDATE 의 Intent.
2.onDisabled 와 onEnabled 방법 에 대해 안 드 로 이 드 의 한 프로그램 이 데스크 톱 에 여러 개의 표 시 된 구성 요 소 를 동시에 설정 할 수 있 기 때 문 입 니 다.
MyAppWidget.java
package com.iflytek.demo;

import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.Context;
import android.content.Intent;

public class MyAppWidget extends AppWidgetProvider {

	@Override
	public void onDeleted(Context context, int[] appWidgetIds) {//      
		System.out.println("*** MyAppWidget onDeleted");
		super.onDeleted(context, appWidgetIds);
	}

	@Override
	public void onDisabled(Context context) {//         
		System.out.println("*** MyAppWidget onDisabled");
		super.onDisabled(context);
	}

	@Override
	public void onEnabled(Context context) {//         
		System.out.println("*** MyAppWidget onEnabled");
		super.onEnabled(context);
	}

	@Override
	public void onReceive(Context context, Intent intent) {//     
		System.out.println("*** MyAppWidget onReceive");
		super.onReceive(context, intent);
	}

	@Override
	public void onUpdate(Context context, AppWidgetManager appWidgetManager,
			int[] appWidgetIds) {//      
		System.out.println("*** MyAppWidget onUpdate");
		super.onUpdate(context, appWidgetManager, appWidgetIds);
	}

}


위 에 서 는 AppWidget Provider 의 수명 주기 와 관련 된 몇 가지 방법 만 복사 할 뿐,AppWidget 프로그램 을 표시 하려 면 데스크 톱 디 스 플레이 를 설정 한 프로필 을 정의 해 야 합 니 다.이 파일 은 res\xml 폴 더 에 저 장 됩 니 다.xdwang_appwidget.xml.xml
<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider 
	xmlns:android="http://schemas.android.com/apk/res/android"
	android:minHeight="80px"
	android:minWidth="300px"
	android:updatePeriodMillis="6000"
	android:initialLayout="@layout/xdwang_appwidget">
</appwidget-provider>

xdwang_appwidget.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <ImageView
        android:id="@+id/img"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:src="@drawable/ic_launcher" />

    <Button
        android:id="@+id/but"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:text="   " />

</LinearLayout>

AndroidManifest.xml
<receiver android:name=".MyAppWidget" >

            <!-- AppWidget      -->
            <intent-filter >
                <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
            </intent-filter>

            <!--   AppWidget     ,android:name:AppWidget   ,android:resource           -->
            <meta-data
                android:name="android.appwidget.provider"
                android:resource="@xml/xdwang_appwidget" />
        </receiver>

 
2.AppWidget 을 사용 하여 Activity 로 이동 하여 조작
앞에서 우 리 는 AppWidget 프로그램의 설정 을 간단하게 설명 하 였 으 나,실제 상황 에서 데스크 톱 에 표 시 된 AppWidget 을 누 르 면 Activity 프로그램 에 들 어가 더욱 복잡 한 조작 처 리 를 할 수 있 는 경우 가 많 습 니 다.여기 서 먼저 AppWidgetManager 가 제공 하 는 방법 을 살 펴 보 겠 습 니 다.
No.
방법.
묘사 하 다.
1
Public void updateAppWidget(int appWidgetId,RemoveViews views)
지정 한 AppWidget 구성 요소 업데이트
2
Public void updateAppWidget(ComponentName provider, RemoveViews views)
지정 한 AppWidget 구성 요소 업데이트
3
Public void updateAppWidget(int[] appWidgetIds,RemoveViews views)
지정 한 AppWidget 구성 요소 업데이트
4
Public static AppWidgetManager getInstance(Context context)
AppWidgetManager 의 인 스 턴 스 를 가 져 옵 니 다.
MyAppWidget.java
package com.iflytek.demo;

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

public class MyAppWidget extends AppWidgetProvider {
	@Override
	public void onUpdate(Context context, AppWidgetManager appWidgetManager,
			int[] appWidgetIds) {//      
		for (int x = 0; x < appWidgetIds.length; x++) {//        AppWidget
			Intent intent = new Intent(context, AppWidget02Activity.class);//   Activity
			PendingIntent pendingIntent = PendingIntent.getActivity(context, 0,
					intent, PendingIntent.FLAG_UPDATE_CURRENT);//        Intent
			RemoteViews remote = new RemoteViews(context.getPackageName(),
					R.layout.xdwang_appwidget);//       RemoveViews
			remote.setOnClickPendingIntent(R.id.but, pendingIntent);
			appWidgetManager.updateAppWidget(appWidgetIds[x], remote);//        
		}
	}

}


3.AppWidget 을 사용 하여 방송 MyAppWidget.자바
package com.iflytek.demo;

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.widget.RemoteViews;

public class MyAppWidget extends AppWidgetProvider {

	@Override
	public void onReceive(Context context, Intent intent) {
		if ("com.iflytek.action.MYAPPWIDGET_UPDATE".equals(intent.getAction())) {//         Action
			RemoteViews remote = new RemoteViews(context.getPackageName(),
					R.layout.xdwang_appwidget);//   RemoveViews
			remote.setImageViewResource(R.id.img, R.drawable.ic_launcher);//     
			remote.setTextViewText(R.id.but, "     ");//       
			AppWidgetManager appWidgetManager = AppWidgetManager
					.getInstance(context);//   AppWidgetManager
			ComponentName componentName = new ComponentName(context,
					MyAppWidget.class);//        
			appWidgetManager.updateAppWidget(componentName, remote);//     
		} else {
			super.onReceive(context, intent); //        ,      onUpdate()
		}
	}

	@Override
	public void onUpdate(Context context, AppWidgetManager appWidgetManager,
			int[] appWidgetIds) {
		Intent intent = new Intent();//         Intent
		intent.setAction("com.iflytek.action.MYAPPWIDGET_UPDATE");
		PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0,
				intent, PendingIntent.FLAG_UPDATE_CURRENT);//        Intent
		RemoteViews remote = new RemoteViews(context.getPackageName(),
				R.layout.xdwang_appwidget);//       RemoveViews
		remote.setOnClickPendingIntent(R.id.but, pendingIntent);
		appWidgetManager.updateAppWidget(appWidgetIds, remote);//       
	}

}


AndroidManifest.xml
<receiver android:name=".MyAppWidget" >
            <intent-filter >
                <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
            </intent-filter>
            <intent-filter >
                <action android:name="com.iflytek.action.MYAPPWIDGET_UPDATE" />
            </intent-filter>

            <meta-data
                android:name="android.appwidget.provider"
                android:resource="@xml/xdwang_appwidget" />
        </receiver>

좋은 웹페이지 즐겨찾기