精华内容
下载资源
问答
  • android 桌面小工具

    2012-12-31 09:18:10
    这是android客户端的桌面小工具的实现方法,程序员可以集成在你程序中
  • android 桌面小工具(Widget)开发教程

    千次阅读 2013-08-12 14:15:15
    这个Widget会每隔5秒钟自动切换内容和图片,图片最好使用图,大图会导致你手机桌面(UI)线程卡顿 教程开始: 1、首先创建一个布局(layout),用以显示Wdiget activity_main.xml <RelativeLayout xmlns:...

    刚学做了个Widget,感觉不错哦,先来秀下效果(用朋友手机截的图)

    这个Widget会每隔5秒钟自动切换内容和图片,图片最好使用小图,大图会导致你手机桌面(UI)线程卡顿


    教程开始:

    1、首先创建一个布局(layout),用以显示Wdiget

    activity_main.xml

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@drawable/ddz_gameend_frame"            
        >
       <!--Relativelayout 的 android:background请自行更换你的图片-->
       <TextView 
            android:id="@+id/textview_1"
            android:layout_width="60.0dp"
            android:layout_height="90.0dp"
            android:layout_marginLeft="35.0dp"
            android:layout_marginTop="34.0dp"
            android:textColor="#000000"
            android:text=""
            />
        <ImageView
            android:id="@+id/imageview_1"
            android:layout_width="136.0dp"
            android:layout_height="92.0dp"
            android:layout_toRightOf="@+id/textview_1"
            android:layout_marginLeft="5.0dp"
            android:layout_marginTop="42.0dp"
            />
        <Button 
            android:id="@+id/button_1"
            android:layout_width="50.0dp"
            android:layout_height="20.0dp"
            android:layout_below="@+id/textview_1"
            android:layout_marginTop="10.0dp"
            android:layout_marginLeft="35.0dp"
            android:text="详情"        
            />
         <!--本人的程序用了android:background="@drawable/mybutton",为了简化示例在此不使用-->
     </RelativeLayout>
    
    

    2、然后创建一个appwidget-provider 的XML文件,点击资源目录的Res文件夹,鼠标右键选择New- android xml file

    mywidget_provider.xml

    <?xml version="1.0" encoding="utf-8"?>
    <appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
        android:resizeMode="horizontal"
        android:minWidth="250.0dp"
        android:minHeight="110.0dp"
        android:updatePeriodMillis="86400000"
        android:initialLayout="@layout/activity_main"
        android:widgetCategory="home_screen|keyguard"
        >
    </appwidget-provider>

    android:updatePeriodMillis指示了更新间隔,8640000024小时,也就是一天一次,本程序自己采用后台服务更新,所以该设置其实对本程序来说关系不大。 android:initialLayout就是指向的Widget布局
    android:widgetCategory指示该Widget可以用作桌面和锁屏


    3、在src目录创建代码文件(本实例建了包  com.feature.test;)

    Constant.class   (用来定义一些常量的类)

    package com.feature.test;
    
    public class Constant {
    
    	//更新广播
    	public static final String ACTION_UPDATE_ALL="com.feature.test.update_all";
    	
    	//intent integer data
    	public static final String INTEGER_DATA="integer_data";
    }
    



    MyAppWidgetProvider.class    (用来处理Widget更新的类)

    package com.feature.test;
    
    import java.util.HashSet;
    import java.util.Iterator;
    
    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.util.Log;
    import android.widget.RemoteViews;
    import android.widget.Toast;
    
    public class MyAppWidgetProvider extends AppWidgetProvider{
    
    	private static final Intent AppWidget_Service=new Intent("com.feature.test.MyAppWidgetService");
    	
    	//保存WidgetId HashSet  可能有用户创建了多个Widget
    	private static HashSet<Integer> hashSet=new HashSet<Integer>();
    	//图片资源,作者请自行修改成自己的图片
    	private static final int[] ResId={R.drawable.a1,R.drawable.a2,R.drawable.a3,R.drawable.a4,R.drawable.a5};
    	//文本资源
    	private static final String[] intro={"神挡杀神,佛挡杀佛","仿佛兮若轻云之蔽月,飘飘兮若流风之回雪",
    			                     "此乃驱狼吐虎之计,敬你之手他一搏吧","汝等小儿,可敢杀我",
    			                     "汝等看好了"};
    	private static int iCur=-1;
    	
    	//周期更新时调用
    	@Override
    	public void onUpdate(Context context,AppWidgetManager appWidgetProvider,int[] appWidgetIds)
    	{
    		Log.v("创建Widget", "OK");
    		// 每次 widget 被创建时,对应的将widget的id添加到set中
    		for(int id:appWidgetIds)
    			hashSet.add(Integer.valueOf(id));
    		
    	}
    	
    	//当桌面组件删除时调用
    	@Override
    	public void onDeleted(Context context,int[] appWidgetIds)
    	{
    		for(int id:appWidgetIds)
    			hashSet.remove(id);
    		
    		super.onDeleted(context, appWidgetIds);
    	}
    	
    	//当桌面提供的第一个组件创建时调用
    	@Override
    	public void onEnabled(Context context)
    	{
    		//启动服务
    		context.startService(AppWidget_Service);
    		
    		super.onEnabled(context);
    	}
    	
    	//当桌面提供的最后一个组件删除时调用
    	@Override
    	public void onDisabled(Context context)
    	{
    		//停止服务
    		context.stopService(AppWidget_Service);
    		
    		super.onDisabled(context);
    	}
    	
    	/*
    	 * 重写广播接收方法
    	 * 用于接收除系统默认的更新广播外的  自定义广播(本程序由服务发送过来的,一个是更新UI,一个是按钮事件消息)
    	 */
    	@Override
    	public void onReceive(Context context,Intent intent)
    	{
    		String getAction=intent.getAction();
    		if(getAction.equals(Constant.ACTION_UPDATE_ALL))
    		{
    			//更新广播
    			
    			updateAllWidget(context,AppWidgetManager.getInstance(context), hashSet);
    		}
    		else if(intent.hasCategory(Intent.CATEGORY_ALTERNATIVE))
    		{
    			Uri data=intent.getData();
    			Log.v("button",data.toString()+" ");
    			int buttonid=Integer.parseInt(data.getSchemeSpecificPart());
    			Toast.makeText(context, intro[buttonid],Toast.LENGTH_SHORT).show();
    		}
    		
    		super.onReceive(context, intent);
    	}
    	
    	//更新UI
    	public void updateAllWidget(Context context,AppWidgetManager manager,HashSet<Integer> set)
    	{
    		int AppId;
    		Iterator iterator=set.iterator();
    		
    		iCur=iCur+1>=intro.length? 0: iCur+1;
    		
    		while(iterator.hasNext())
    		{
    			AppId=((Integer)iterator.next()).intValue();
    			
    			RemoteViews remoteViews=new RemoteViews(context.getPackageName(),R.layout.activity_main);
    			//设置显示的文字图片
    			remoteViews.setTextViewText(R.id.textview_1, intro[iCur]);
    			remoteViews.setImageViewResource(R.id.imageview_1, ResId[iCur]);
    			//添加按钮事件处理
    			remoteViews.setOnClickPendingIntent(R.id.button_1, getPendingIntent(context, iCur));
    			//更新
    			manager.updateAppWidget(AppId, remoteViews);
    		}
    	}
    	
    	//设置按钮事件处理
    	private PendingIntent getPendingIntent(Context context,int buttonid)
    	{
    		Intent intent=new Intent("test.test");
    		intent.setClass(context, MyAppWidgetProvider.class);
    		intent.addCategory(Intent.CATEGORY_ALTERNATIVE);
    		intent.setData(Uri.parse("custom:"+buttonid));
    		//进行广播
    		PendingIntent pi=PendingIntent.getBroadcast(context, 0, intent, 0);
    		return pi;
    	}
    }
    

    4、创建后台服务,用来定时发送广播,通知Widget需要更新了

    MyAppWidgetService。class

    package com.feature.test;
    
    import android.app.Service;
    import android.content.Context;
    import android.content.Intent;
    import android.os.IBinder;
    
    public class MyAppWidgetService extends Service{
    
    	private Context context;
    	//更新周期
    	private static final int UPDATE_TIME=5000;
    	//周期性更新的Widget 线程
    	private WidgetThread widgetThread;
    	
    	@Override
    	public IBinder onBind(Intent intent) {
    		// TODO Auto-generated method stub
    		return null;
    	}
    
    	@Override
    	public void onCreate()
    	{
    		widgetThread=new WidgetThread();
    		widgetThread.start();
    		
    		context=this.getApplicationContext();
    		super.onCreate();
    	}
    	
    	@Override
    	public void onDestroy()
    	{
    		if(widgetThread!=null&&widgetThread.isAlive())
    			widgetThread.interrupt();
    		
    		super.onDestroy();
    	}
    	
    	private class WidgetThread extends Thread
    	{
    		@Override
    		public void run()
    		{
    			try
    			{
    				while(true)
    				{
    					Intent intent=new Intent(Constant.ACTION_UPDATE_ALL);
    					context.sendBroadcast(intent);
    					
    					sleep(UPDATE_TIME);
    				}
    			}catch(InterruptedException error)
    			{
    				// 将 InterruptedException 定义在while循环之外,意味着抛出 InterruptedException 异常时,终止线程。
    			}
    		}
    	}
    }
    

    5、在AndroidManifest.xml注册Widget和服务

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.feature.test"
        android:versionCode="1"
        android:versionName="1.0" >  
     
        <uses-sdk android:minSdkVersion="8"  android:targetSdkVersion="8"/>
        <application
            android:allowBackup="true"
            android:icon="@drawable/ic_launcher"
            android:label="@string/app_name"
            android:theme="@android:style/Theme.Black" >
            <!-- 注册AppWidget Provider -->
            <receiver 
                android:name="com.feature.test.MyAppWidgetProvider">
                <meta-data android:name="android.appwidget.provider"
                           android:resource="@xml/mywidget_provider"
                           />
                <intent-filter >                                      
                    <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
                    <action android:name="com.feature.test.update_all" />
                </intent-filter>
            </receiver>
            
            <!-- 注册服务 -->
            <service android:name=".MyAppWidgetService">
                <intent-filter>
                    <action android:name="com.feature.test.MyAppWidgetService"/>
                </intent-filter>
            </service>
                
                
        </application>
    
    </manifest>

    至此大功告成!有问题请、意见请回复,本人虚心求教委屈


    另外:

    1、如果你手机安装了自己做的Widget,在添加-窗口小工具显示不出来,那是因为你把它装到SD卡导致的,请在应用程序里找到自己的Widget将其移至手机存储即可显示

    2、如果你安装的Widget放到桌面上,一直在显示“正在加载窗口小工具”,说明该Widget使用了您手机版本不支持的Widget控件,如EditText,使用它就会报错

    展开全文
  • android AppWidgetProvider开发桌面小工具

    千次阅读 2017-10-20 10:29:24
    什么是桌面小工具 就是你写好代码后 双指缩放桌面屏幕(三星手机出现小组件,华为出现窗口小工具)点击之后会出现你继承AppWidgetProvider所编写的界面 效果: 代码: /** * ...


    什么是桌面小工具  就是你写好代码后 双指缩放桌面屏幕(三星手机出现小组件,华为出现窗口小工具)点击之后会出现你继承AppWidgetProvider所编写的界面




    效果:



    代码:

    /**
     * Implementation of App Widget functionality.做一些自己的操作即可 */
    public class NewAppWidget extends AppWidgetProvider {
    
        static void updateAppWidget(Context context, AppWidgetManager appWidgetManager,
                                    int appWidgetId) {
    
            CharSequence widgetText = context.getString(R.string.appwidget_text);
            // Construct the RemoteViews object
    
            RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.new_app_widget);
            views.setTextViewText(R.id.appwidget_text, widgetText);
    
            // Instruct the widget manager to update the widget
            appWidgetManager.updateAppWidget(appWidgetId, views);
        }
    
        @Override
        public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
            // There may be multiple widgets active, so update all of them
            for (int appWidgetId : appWidgetIds) {
                updateAppWidget(context, appWidgetManager, appWidgetId);
            }
        }
    
        @Override
        public void onEnabled(Context context) {
            // Enter relevant functionality for when the first widget is created
        }
    
        @Override
        public void onDisabled(Context context) {
            // Enter relevant functionality for when the last widget is disabled
        }
    }
    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
    
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    
    <receiver android:name=".NewAppWidget">
        <intent-filter>
            <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
        </intent-filter>
    
        <meta-data
            android:name="android.appwidget.provider"
            android:resource="@xml/new_app_widget_info" />
    </receiver>


    展开全文
  • 前情提要: 自己用的魅族的手机,魅族15和魅族17,发现魅族系统没有自带的桌面息屏...emmmm,这个项目里涉及的技术其实不多,其一是android widget桌面小控件的开发,这个知识点在网上一查一大把,我也就不多赘..

    前情提要:

    自己用的魅族的手机,魅族15和魅族17,发现魅族系统没有自带的桌面息屏小工具,下一个网上提供的息屏apk又怕不安全,还有广告,故自己琢磨琢磨地就搞了一个简单的桌面息屏小工具;

    正文:


        先提供这个项目的github网址:https://github.com/oldsboy/CloseWindow。安装包在app/release/文件夹下面有分享。

    emmmm,这个项目里涉及的技术其实不多,其一是android widget桌面小控件的开发,这个知识点在网上一查一大把,我也就不多赘述,其中有一个重点是:widget控件的交互(比如说点击)是以广播的形式进行传递的,而android8以后android便不允许应用接收隐式广播,而导致点击桌面小控件没有反应,所以需要在点击事件传递的intent中加入0x01000000这个flag来突破这个限制,也不知道以后会不会改,如果不行可以考虑再创建一个动态广播来处理锁屏事件。

        @Override
        public void onReceive(Context context, Intent intent) {
            super.onReceive(context, intent);
    
            if (intent != null && intent.getAction() != null) {
                Log.d(TAG, "onReceive: 收到广播通知:" + intent.getAction());
                switch (intent.getAction()) {
                    case BTN_CLICK_ACTION:
                        closeWindow(context);
                }
            }
        }
    
        private void closeWindow(final Context context) {
            ComponentName adminReceiver = new ComponentName(context, AdminReceiver.class);
            DevicePolicyManager systemService = (DevicePolicyManager) context.getSystemService(DEVICE_POLICY_SERVICE);
            if (!systemService.isAdminActive(adminReceiver)){
                Toast.makeText(context, "需要先进入app进行授权", Toast.LENGTH_SHORT).show();
            }else {
                Log.d(TAG, "closeWindow: ");
                new Handler().postDelayed(systemService::lockNow, 300);
            }
        }
    
        @Override
        public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
            super.onUpdate(context, appWidgetManager, appWidgetIds);
    
            RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.lock_layout);
    
            remoteViews.setImageViewResource(R.id.img_lock, R.drawable.press_icon);
    
            Intent intent = new Intent(BTN_CLICK_ACTION);
            intent.setClass(context, MonitorWidgetProvider.class);
            intent.setFlags(intent.getFlags()| 0x01000000);
    
            PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
            remoteViews.setOnClickPendingIntent(R.id.img_lock, pendingIntent);
    
            appWidgetManager.updateAppWidget(appWidgetIds, remoteViews);
            Log.d(TAG, "onUpdate: 配置点击事件完成");
        }

    上述代码交代的是桌面小控件的行为逻辑。其二是锁屏的处理,我上篇文章也吐槽了网上使用wakeLock来实现锁屏的代码其实很难实现,至少我翻来覆去使用wakeLock也没见我屏幕黑掉。。。所以使用DevicePolicyManager来实现息屏的效果。而使用这个功能则必须要通过手机设备管理员权限才能实现。

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            this.setContentView(R.layout.lock_layout);
    
            ComponentName adminReceiver = new ComponentName(this, AdminReceiver.class);
            DevicePolicyManager systemService = (DevicePolicyManager) getSystemService(DEVICE_POLICY_SERVICE);
            if (!requestLockAdmins(systemService, adminReceiver)){
                Toast.makeText(this, "点击按钮申请权限后可以息屏", Toast.LENGTH_SHORT).show();
            }
            ((TextView)this.findViewById(R.id.tv)).setOnClickListener(v -> {
                if (requestLockAdmins(systemService, adminReceiver)){
                    systemService.lockNow();
                }
            });
        }
    
        /**
         *申请设备管理员权限
         */
        private boolean requestLockAdmins(DevicePolicyManager systemService, ComponentName adminReceiver) {
            if (systemService == null) return false;
            //检查是否已经获取设备管理权限
            boolean active = systemService.isAdminActive(adminReceiver);
            if (!active) {
                //打开DevicePolicyManager管理器,授权页面
                Intent intent = new Intent();
                //授权页面Action -->  DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN
                intent.setAction(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
                //设置DEVICE_ADMIN,告诉系统申请管理者权限的Component/DeviceAdminReceiver
                intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, adminReceiver);
                //设置 提示语--可不添加
                intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION, "DevicePolicyManager涉及的管理权限,一次性激活!");
                startActivityForResult(intent, REQUEST_DevicePolicy);
            }
            return active;
        }

    上述代码是跳转到申请设备管理员页面的实现,那至此就是这个息屏工具的大部分实现了,还有一些widget设定的细节就不展示了,没有在那里下多大功夫。

    展开全文
  • 实现桌面小工具的关键类AppWidgProvider AppWidgetProvider的本质是一个广播接收者,如下: public class AppWidgetProvider extends BroadcastReceiver 说道广播接收者,那么它的工作原理应该是接收到对应的...

    实现桌面小工具的关键类AppWidgProvider

    AppWidgetProvider的本质是一个广播接收者,如下:

    public class AppWidgetProvider extends BroadcastReceiver 

    说道广播接收者,那么它的工作原理应该是接收到对应的广播后会去调用其onReceive方法。接下来就来看它的onReceive方法:

    public void onReceive(Context context, Intent intent) {
        // Protect against rogue update broadcasts (not really a security issue,
        // just filter bad broacasts out so subclasses are less likely to crash).
        String action = intent.getAction();
        if (AppWidgetManager.ACTION_APPWIDGET_UPDATE.equals(action)) {
            Bundle extras = intent.getExtras();
            if (extras != null) {
                int[] appWidgetIds = extras.getIntArray(AppWidgetManager.EXTRA_APPWIDGET_IDS);
                if (appWidgetIds != null && appWidgetIds.length > 0) {
                    this.onUpdate(context, AppWidgetManager.getInstance(context), appWidgetIds);
                }
            }
        } else if (AppWidgetManager.ACTION_APPWIDGET_DELETED.equals(action)) {
            Bundle extras = intent.getExtras();
            if (extras != null && extras.containsKey(AppWidgetManager.EXTRA_APPWIDGET_ID)) {
                final int appWidgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID);
                this.onDeleted(context, new int[] { appWidgetId });
            }
        } else if (AppWidgetManager.ACTION_APPWIDGET_OPTIONS_CHANGED.equals(action)) {
            Bundle extras = intent.getExtras();
            if (extras != null && extras.containsKey(AppWidgetManager.EXTRA_APPWIDGET_ID)
                    && extras.containsKey(AppWidgetManager.EXTRA_APPWIDGET_OPTIONS)) {
                int appWidgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID);
                Bundle widgetExtras = extras.getBundle(AppWidgetManager.EXTRA_APPWIDGET_OPTIONS);
                this.onAppWidgetOptionsChanged(context, AppWidgetManager.getInstance(context),
                        appWidgetId, widgetExtras);
            }
        } else if (AppWidgetManager.ACTION_APPWIDGET_ENABLED.equals(action)) {
            this.onEnabled(context);
        } else if (AppWidgetManager.ACTION_APPWIDGET_DISABLED.equals(action)) {
            this.onDisabled(context);
        } else if (AppWidgetManager.ACTION_APPWIDGET_RESTORED.equals(action)) {
            Bundle extras = intent.getExtras();
            if (extras != null) {
                int[] oldIds = extras.getIntArray(AppWidgetManager.EXTRA_APPWIDGET_OLD_IDS);
                int[] newIds = extras.getIntArray(AppWidgetManager.EXTRA_APPWIDGET_IDS);
                if (oldIds != null && oldIds.length > 0) {
                    this.onRestored(context, oldIds, newIds);
                    this.onUpdate(context, AppWidgetManager.getInstance(context), newIds);
                }
            }
        }
    }

    从上述源码中可以看出其逻辑近似于switch,APPWidgetProvider 会自动比对广播的 Action,从而分发广播,也就是分情况调用 onUpdate,onEnabled,onDisabled,onDeleted等方法。而这几种方法的调用时机如下:

    • onEnable:当该桌面小工具第一次添加到桌面时调用该方法,可添加多次但只在第一次调用
    • onUpdate:小工具被添加时或者每次小工具更新时都会调用一次该方法,小工具的更新时机由updatePeriodMillis来指定,每个周期小工具都会自动更新一次
    • onDeleted:每删除一次桌面小工具就调用一次
    • onDisabled:当最后一个该类型的桌面小工具被删除时调用该方法
    • onReceive:这是广播的内置方法,用于分发具体的事件给其他方法

    实现桌面小工具的步骤

    1.定义小工具的界面

    和创建布局文件一样,在res/layout/目录下新建一个xml文件即可,名称和内容均可自定义。这里只是简单的添加了一个ImageView.

    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
        <ImageView
            android:id="@+id/iv_icon"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/timg"/>
    </LinearLayout>

    2.定义小工具的配置信息

    在res/xml/目录下新建一个xml文件,名称可以自定义,这里新建了一个appwidget_info.xml:

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

     这里只用到了最基本的最小宽高属性以及刷新频率,其中86400000单位是ms即24小时,也就是一天一次。除此之外,它还支持一些其他的属性,如下:

    • previewImage:当用户选择添加 widget 时的预览图片。如果该属性没有定义,则展示 applicationg 的 launcher icon
    • configure:定义了用户在添加 widget 时弹出的配置页面的 Activity,用户可以在此进行 Widget 的一些配置,该 Activity 是可选的,如果不需要可以不进行声明
    • resizeMode:widget 在水平和垂直方向是否可以调整大小,值可以为:horizontal(水平方向可以调整大小),vertical (垂直方向可以调整大小),none(不可以调整大小),也可以 horizontal|vertical 组合表示水平和垂直方向均可以调整大小
    • widgetCategory:表示 widget 可以显示的位置,包括 home_screen(桌面),keyboard(锁屏)

    3. 定义小工具的实现类

    这个类需要继承AppWidge Provider,代码如下:

    public class MyAppWidgetProvider extends AppWidgetProvider {
        private static final String TAG = "MyAppWidgetProvider";
        public static final String CLICK_ACTION = "com.appwidget.action.CLICK";
        public MyAppWidgetProvider() {
            super();
        }
    
        @Override
        public void onReceive(final Context context, Intent intent) {
            super.onReceive(context, intent);
            Log.d(TAG, "onReceive: ");
            if(intent.getAction().equals(CLICK_ACTION)){//如果是自己的Action
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        Bitmap srcBitmap = BitmapFactory.decodeResource(context.getResources(),R.drawable.timg);
                        AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
                        //旋转
                        for(int i=0;i<37;i++){
                            float degree = (i*10)%360;
                            RemoteViews remoteViews = new RemoteViews(context.getPackageName(),R.layout.widget);
                            //设置旋转后的图片
                            remoteViews.setImageViewBitmap(R.id.iv_icon,rotateBitmap(srcBitmap,degree));
    
                            Intent intentClick = new Intent();
                            intentClick.setAction(CLICK_ACTION);
                            PendingIntent pendingIntent = PendingIntent.getBroadcast(context,0,intentClick,0);
                            remoteViews.setOnClickPendingIntent(R.id.iv_icon,pendingIntent);//设置点击事件监听
    
                            appWidgetManager.updateAppWidget(new ComponentName(context,MyAppWidgetProvider.class),remoteViews);
                            SystemClock.sleep(30);
                        }
                    }
                }).start();
            }
        }
        /**
         * 每次桌面小工具更新时都会调用一次该方法
         * */
        @Override
        public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
            super.onUpdate(context, appWidgetManager, appWidgetIds);
            final int counter = appWidgetIds.length;
            for(int i = 0;i<counter;i++){
                int appWidgetId = appWidgetIds[i];
                onWidgetUpdate(context,appWidgetManager,appWidgetId);
            }
        }
    
        /**
         * 更新桌面小工具
         * */
        private void onWidgetUpdate(Context context,AppWidgetManager appWidgetManager,int appWidgetId){
            RemoteViews remoteViews = new RemoteViews(context.getPackageName(),R.layout.widget);
            Intent intentClick = new Intent();
            intentClick.setAction(CLICK_ACTION);
            PendingIntent pendingIntent = PendingIntent.getBroadcast(context,0,intentClick,0);
            remoteViews.setOnClickPendingIntent(R.id.iv_icon,pendingIntent);
            appWidgetManager.updateAppWidget(appWidgetId,remoteViews);
        }
    
        /**
         * 旋转图片
         * */
        private Bitmap rotateBitmap(Bitmap bitmap,float degree){
            Matrix matrix = new Matrix();
            matrix.reset();
            matrix.setRotate(degree);
            return Bitmap.createBitmap(bitmap,0,0,bitmap.getWidth(),bitmap.getHeight(),matrix,true);
        }
    }

    上面的代码实现了一个简单的桌面小工具,该小工具展示一张图片,并且点击它之后,这个图片会旋转一周。当这个桌面小工具被添加到桌面后,会通过 RemoteViews 来加载布局文件,而当桌面小工具被单击之后的旋转效果则是通过不断的更新RemoteViews 来实现的。

    4.在AndroidManifest.xml文件中声明该桌面小工具、然后动态注册小工具的实现类(广播接收者)

    <receiver android:name=".MyAppWidgetProvider">
        <meta-data
            android:name="android.appwidget.provider"
            android:resource="@xml/appwidget_info"></meta-data>
        <intent-filter>
            <action android:name="android.appwidget.action.APPWIDGET_UPDATE"/>
        </intent-filter>
    </receiver>
    MyAppWidgetProvider appWidgetProvider = new MyAppWidgetProvider();
    IntentFilter intentFilter = new IntentFilter();
    intentFilter.addAction(MyAppWidgetProvider.CLICK_ACTION);
    registerReceiver(appWidgetProvider,intentFilter);

    其中 AndroidManifest 中的 action 是桌面小工具的标识,是系统规范,如果不加那么这个 receiver 则不是一个桌面小工具,无法在手机的小工具列表中找到它。

    展开全文
  •  很多人都看过用过andorid的桌面小工具,比如可监视电池电量Widget、实时天气情况等等。这些都属于AndroidAppWIdget。要编写这样的小工具,其实不难。  设计思路一般是这样的:利用AppWIdgetProvider对象来构建...
  • App Widgets are miniature application views that can be embedded in other applications (such as the Home ...App Widgets是一个桌面应用程序,像快捷方式一样,放在我们的桌面上,他还可以为我们提供数据的更
  • [安卓开源]仿百度桌面转盘小工具项目.zip
  • 近日苹果发布了全新的 iOS 14 操作系统,首次新增了桌面(主屏幕)Widget 小工具,和图标摆放在一起的风格与 Android 系统极为相似,但在 WWDC 面向开发者的讲座中,苹果进一步解释关于 Widget 小工具的设计细节。...
  • 1.应用场景:需求,便利需求,想快捷进行信息获取或操作手机,...组件类型:目前android系统只会调用四大组件,那么桌面小控件是哪类组件呢?  b.生命周期:窗口小部件是如何启动的?谁负责启动它?在什么时候启动?
  • Android 测试小工具基于Maven的Java Swing GUI桌面应用开发并集成adb命令完成应用程序信息快速查看,工具的主要用途用于快速获取安卓设备当前正在运行的最顶层APP的相关信息,如:PackName、PackBit、Launchable_...
  • 项目桌面帮助程序 里面涉及到的代码 1. '打开任务管理器 Shell "taskmgr.exe", vbNormalFocus Dim s As String s = Environ("windir") s = s & "\system32\taskmgr.exe" Open s ...
  • 关键字:应用小插件 小部件 小工具 应用程序窗口小部件App Widgets 应用程序窗口小部件(Widget)是微小的应用程序视图,可以被嵌入到其它应用程序中(比如桌面)并接收周期性的更新。你可以通过一个App ...
  • 桌面便签作为职场人士常用的电脑记事工具,能不能用做工作计划软件呢?其实,兼具记事和提醒功能的桌面便签就可以作为工作计划软件使用,比如说敬业签,它就具备以上这些功能,而且它还具备多端云同步(Windows/...
  • OneWidget 是一款支持在 iOS 14 上自定义小组件显示内容的工具,支持设置的内容有时间、习惯、待办事项、生命倒计时等等。本文除了 OneWidget 的产品介绍外,还包括了我在开发 OneWidget 的过程中对相关 iOS 14 ...
  • 前段时间unc0ver团队发布了最新版本的「unc0ver越狱工具」,这个越狱工具利用了Pwn20wnd发现的“零日”漏洞,并且支持iOS13.5系统。目前最新版本的iOS13.5.1已经封堵了可以越狱的漏洞,所以是不支持的。支持系统版本...
  • 桌面便签作为职场人士常用的电脑记事工具,能不能用做工作计划软件呢?其实,兼具记事和提醒功能的桌面便签就可以作为工作计划软件使用,比如说敬业签,它就具备以上这些功能,而且它还具备多端云同步(Windows/...
  • 本项目是一个简单安卓的课表程序源码,内容及构造都较为简单,比刚发的这个记事本项目(....80%以上的代码段都有注释,除了基础的ListView和Sqlite还用到了通知服务(Notication)和桌面小插件(appwidget)的技术。 
  • android桌面小控件—电池状态显示 1 . 桌面控件介绍 本案例安装完成后不会有应用程序的提示,而是在手机的小工具中可以看到该插件,当单击本插件拖动到桌面后即可显示效果。  所谓桌面小控件,就是能之间显示...
  • Android 应用都提供有这些小组件。App Widget 就是我们通常所说的桌面小组件。就是放置在手机屏幕上的例如始终,日历,天气等...桌面小组件是帮助我们快速访问应用的工具。 App Widget: 参考官方API 指南: 点击打开
  • Android-Widget桌面应用部件

    千次阅读 2017-05-10 23:47:03
    官方文档中国版: https://developer.android.google.cn/guide/index.html?q=widget 这个网站是谷歌2016年底为中国开发者提供中国版,方便...例如在桌面的天气,日历类小工具就是Widget部件! 二.创建Widget广播接收器 p
  • 前言 本文主要介绍一个测试小工具,使用这个小工具可以快速获取app的包名、版本号等相关信息。此小工具是一位大牛开发,项目地址:...首先到github上下载项目源码,然后Windows 桌面双击Android...
  • 本项目是一个简单安卓的课表程序源码,内容及构造都较为简单,比刚发的这个记事本项目...80%以上的代码段都有注释,除了基础的ListView和Sqlite还用到了通知服务(Notication)和桌面小插件(appwidget)的技术。
  • 转载请注明:(http://blog.csdn.net/u012854870/article/details/73251151)需求:Android截屏后对图片进行编辑,添加随手指移动缩放大小的椭圆,类似桌面版QQ截图后编辑绘制椭圆工具 先上效果图: 实现代码...
  • 苹果即将在 6/22 线上举办 WWDC 全球开发者大会,依照惯例都会在这个时候发表新的 iOS、watchOS、macOS 和 ...在 iOS 14 版本中,桌面可以添加 App 小工具,最近设计师 Aleksey Bondarev 就根据大家的揣测,做了一...
  • Android APK 反编译工具集合 v1.1 ========================================= 系统具备java和.net 2.0运行环境 使用方法: 1:把APKReflector.exe 拖到windows工具栏上或者桌面上建立快捷方式,或者加入右键发送...

空空如也

空空如也

1 2 3 4 5 ... 16
收藏数 314
精华内容 125
关键字:

android桌面小工具