zoukankan      html  css  js  c++  java
  • appWidget 简单入门学习笔记

    1,让桌面能够添加你的appWidget

    1,一个类,和2个xml

    //一个实现AppWidgetProvider的类
    public class TomAppWidgetProvider extends AppWidgetProvider {
    
    }
    <!--放在 res/xml 文件夹中命名为tom_appwidget_info.xml-->
    <appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
        android:minWidth="294dp"
        android:minHeight="72dp"
        android:updatePeriodMillis="86400000"
        android:initialLayout="@layout/tom_appwidget"
        android:configure="kg.tom.AppWidgetConfigure" 
        >
    </appwidget-provider>
    <!-- android:initialLayout: 初始化你的appWidget布局 -->

    <!--放置在res/layout/tom_appwidget_provider.xml-->
    <?xml version="1.0" encoding="utf-8"?>
    
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="294dp"
        android:layout_height="72dp"
        android:orientation="vertical"
        >
    <TextView 
        android:id="@+id/appwidget_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="#ff000000"
    />
        <Button
            android:id="@+id/appwidget_button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@android:string/ok"
        />
    
    </LinearLayout>

    在AndroidManifest.xml中声明你的appWidget

    <receiver android:name="TomAppWidgetProvider" >
        <intent-filter>
    <!--让系统能够设别到你的appWidgetProvider的动作-->
            <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
        </intent-filter>
    <!--设置你的appWidget的布局-->
        <meta-data android:name="android.appwidget.provider"
                   android:resource="@xml/tom_appwidget_info" />
    </receiver>

    长按你的Home 界面,你就会看到你的widget已经在列表当中

    image

    但是,现在点击是会出错的,这时候我们需要设置我们的AppWidgetConfigure

    在activity中增加一个Intent-filter

        <intent-filter>
    				<!-- 让系统能够设别到你的appWidgetProvider的动作 -->
    				<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
    			</intent-filter>
    public class AppWidgetConfigure extends Activity {
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            //设置widgetId
            int mAppWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID;
            //1,将setResult 设置为 取消,用于取消widget host
            setResult(RESULT_CANCELED);        
            //2,从Intent 中找到widget 的id 
            Intent intent = getIntent();
            Bundle extras = intent.getExtras();
            if(extras != null){
            	mAppWidgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID,AppWidgetManager.INVALID_APPWIDGET_ID);
            }
            
            //3,如果获取不到 appWidget id 我们就结束
            if(mAppWidgetId == AppWidgetManager.INVALID_APPWIDGET_ID){
            	Log.d("app", "获取失败退出!!!");
            	finish();
            }
            
            
            final Context context = AppWidgetConfigure.this;
            //4,实例化你的 appWidget
            AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
            
            //5,更新widget
            Intent resultValue = new Intent();
            resultValue.putExtra(appWidgetManager.EXTRA_APPWIDGET_ID, mAppWidgetId);
            setResult(RESULT_OK, resultValue);
            finish();
            
            
        }
    }

    2,然后写provider的代码

    public class TomAppWidgetProvider extends AppWidgetProvider {
    	@Override
    	public void onUpdate(Context context, AppWidgetManager appWidgetManager,
    			int[] appWidgetIds) {
    		// TODO Auto-generated method stub
    		super.onUpdate(context, appWidgetManager, appWidgetIds);
    		final int N = appWidgetIds.length;
    		Log.d("app", "onUpdate--->Ids==="+String.valueOf(N) );
    		for(int i=0; i < N; i++){
    			int appWidgetId = appWidgetIds[i];
    			
    			updateAppWidget(context, appWidgetManager, appWidgetId);
    		}
    		
    	}
    	
    	static void updateAppWidget(Context context, AppWidgetManager appWidgetManager,int appWidgetId){
    		Log.d("app", "update---->id" + appWidgetId);
    		//1,widget中的的标题
    		CharSequence text = "这是我第一个widget";
    		//2,widget显示用布局,并设置text显示的值
    		RemoteViews views = new RemoteViews(context.getPackageName(),R.layout.tom_appwidget_provider);
    		views.setTextViewText(R.id.appwidget_text, text);
    		//3,通知widget manager 更新
    		appWidgetManager.updateAppWidget(appWidgetId, views);
    		
    	}
    	
    	@Override
    	public void onDeleted(Context context, int[] appWidgetIds) {
    		// TODO Auto-generated method stub
    		super.onDeleted(context, appWidgetIds);
    		//删除的时候调用的方法
    		int appids = appWidgetIds.length;
    		Log.d("app", "onDelete--->" + appids);
    	}
    }

    然后就可以运行了:

    image

    顺便附上一张简单原理图:..

    appWidget_simple

    2,小小的进阶为widget实现运行activity

    只要在加上几行代码的appwidget 就能实现挑战到Activity的功能

    1,新建一个HelloAppWidget的activity

    static void updateAppWidget(Context context, AppWidgetManager appWidgetManager,int appWidgetId){
    		Log.d("app", "update---->id" + appWidgetId);
    		//1,设置显示用标题
    		CharSequence text = "这是我第一个widget";
    		
    		//1.1,增加跳转用activity相关 intent
    		Intent intent = new Intent(context, HelloAppWidget.class);
    		PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);
    		//2,如果,没有在xml中声明RemoteViews布局,这里就必须要让其他布局基于RemoteViews
    		RemoteViews views = new RemoteViews(context.getPackageName(),R.layout.tom_appwidget_provider);
    		views.setTextViewText(R.id.appwidget_text, text);
    		//2.1将需要跳转的intent绑定到appWidget button中
    		views.setOnClickPendingIntent(R.id.appwidget_button, pendingIntent);
    		
    		//3,通知widget manager 更新
    		appWidgetManager.updateAppWidget(appWidgetId, views);
    		
    	}

    image 跳转到特定activity…ps:使用activity记得在AndroidManifest.xml中注册

  • 相关阅读:
    太赞了!两个技巧帮你记住复杂 Linux 命令!
    Spring Cloud 学习 之 Spring Cloud Eureka(源码分析)
    Spring Cloud 学习 之 Spring Cloud Eureka(架构)
    Spring Cloud 学习 之 Spring Cloud Eureka(搭建)
    Spring Cloud 学习 之 Spring Cloud Eureka(概述)
    Spring Boot学习 之 Spring Boot Actuator(一)
    java基础篇 之 final关键字
    spring学习笔记(九)事务学习(上)
    JAVA基础篇 之 类的初始化
    JAVA基础篇 之 finalize()方法的作用
  • 原文地址:https://www.cnblogs.com/youxilua/p/2189465.html
Copyright © 2011-2022 走看看