窗口小部件的使用AppWidget

最近复习了下Appwidget的使用,做了个简单的案例

创建一个widget能够时时刷新时间,并能点击按钮实现代码的交互


知识梳理:

APPwidget是一个系统级服务,Appwidget在安装应用或页面启动会扫描系统所有已安装的Apk清单文件,发现清单中有AppWidgetProvider的子类会有响应

其中AppWidgetProvider并不是内容提供者,而是继承BroadCastReceiver


效果如图;



开发步骤 

① 布局Layout

② 创建AppWidgetProvider

③ 配置

④  描述文件



布局



    


创建 一个类继承AppWidgetProvider

package com.itheima.appwidgett;

import android.appwidget.AppWidgetProvider;

public class MyAppWidgetReceiver extends AppWidgetProvider {

	
}

配置


        
            
                
            
            

描述文件

描述文件:创建一个xml ,并如下配置







创建一个服务


public class WidgetService extends Service {

	private Timer timer;
	private TimerTask timerTask;
	@Override
	public void onCreate() {
		Log.i("wlz", "WidgetService---创建");
		timer = new Timer();
		timerTask = new TimerTask() {
			
			@Override
			public void run() {
				// 
				SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日  HH:mm:ss");
				Date date = new Date();
				String time = simpleDateFormat.format(date);
				Log.i("wls", time);
				RemoteViews remoteView=new RemoteViews("com.itheima.appwidgett", R.layout.view_appwidget);
				
				//setTextViewText  实现 findViewById   setText
				remoteView.setTextViewText(R.id.button1, time);

				//PendingIntent:点击式的Intent
				//  setOnClickPendingIntent          实现 findViewById setOnClick
				Intent intent=new Intent();//widget点击事件让程序执行一段代码通过发送广播完成
				intent.setAction("com.itheima.widget.action.UPDATE");
				PendingIntent pIntent=PendingIntent.getBroadcast(getBaseContext(), 0, intent, 0);
				remoteView.setOnClickPendingIntent(R.id.button1, pIntent);
				//com.itheima.widget.receiver.MyWidagetReceiver
//				RemoteView:不是真正的View 用于进程间的对view操作。
				ComponentName name=new ComponentName("com.itheima.appwidgett", "com.itheima.appwidgett.MyAppWidgetReceiver");
				//刷新widget
				AppWidgetManager.getInstance(getBaseContext()).updateAppWidget(name, remoteView);
//				AppWidgetManager.getInstance(getBaseContext()).updateAppWidget(更新的widget的类名,
			}
		};
		
		timer.schedule(timerTask, 0, 1000);

	}
	@Override
	public void onDestroy() {
		Log.i("wlz", "WidgetService---销毁");
		if(timer!=null)
		{
			timer.cancel();
			timer=null;
		}

	}
	@Override
	public IBinder onBind(Intent intent) {
		// TODO Auto-generated method stub
		return null;
	}

}

实现小部件调用代码需要用广播来处理

为什么使用到广播来处理事件?

点击是在桌面程序的widget是一个进程

处理代码却在 另外一个进程,只有广播与aidl可以跨进程使用。



创建一个广播测试widget通过广播实现与代码的交互

public class WidgetClickReceiver extends BroadcastReceiver {

	@Override
	public void onReceive(Context context, Intent intent) {
		Toast.makeText(context, "AAAAAAAA", Toast.LENGTH_LONG).show();

	}

}


你可能感兴趣的:(Android开发笔记)