Android桌面插件的开发

想要做个可以在桌面上显示的插件需要3个步骤:
  1. 继承AppWidgetProvider
  2. 编写widget的界面xml, 编写mywidget属性xml
  3. AndroidManifest.xml  注册插件
 
先上图


这个案例是一个会自增的数字, 非常的简单。
 
1. 继承AppWidgetProvider
[java]  
public class MyWidgetProvider extends AppWidgetProvider  
{  
    private static Timer myTimer;  
    private static int index = 0;  
      
    private final String broadCastString = "knowheart.wd.appWidgetUpdate";   
      
    @Override  
    public void onDeleted(Context context, int[] appWidgetIds)  
    {  
        // TODO Auto-generated method stub  
        super.onDeleted(context, appWidgetIds);  
          
    }  
      
      
  
    @Override  
    public void onEnabled(Context context)  
    {  
        // TODO Auto-generated method stub  
        super.onEnabled(context);  
          
    }  
  
  
  
    @Override  
    public void onUpdate(Context context, AppWidgetManager appWidgetManager,  
            int[] appWidgetIds)  
    {  
        // TODO Auto-generated method stub  
        super.onUpdate(context, appWidgetManager, appWidgetIds);  
    }  
      
      
      
    @Override  
    public void onReceive(Context context, Intent intent)  
    {  
        super.onReceive(context, intent);  
    }  
  
}  
首先我们添加一个类, 用于继承AppWidgetProvider, 它就是用来控制我们的插件更新删除的一些操作
这里会用到onEnabled、onUpdate、onReceive三个方法
 
  2. 编写widget的界面xml, 编写mywidget属性xml
layout/widget_layout.xml
[html] 
<?xml version="1.0" encoding="utf-8"?>    
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    android:orientation="vertical"  
    android:background="#000000"  
    android:layout_gravity="center_horizontal"  
    android:layout_width="300dp"  
    android:layout_height="wrap_content">  
  
    <TextView  
        android:id="@+id/update"  
        android:text="0"   
        android:layout_width="fill_parent"  
        android:layout_height="wrap_content"   
        android:gravity="center"  
     />  
      
</LinearLayout>  
 
新建一个文件夹命名xml, 再添加一个xml文件
xml/mywidget.xml
[html]  
<?xml version="1.0" encoding="UTF-8"?>  
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"    
    android:minWidth="300dip" android:minHeight="72dp"    
    android:updatePeriodMillis="86400000"   
    android:initialLayout="@layout/widget_layout"    
    >    
</appwidget-provider>    
 
这里设置插件的长宽、刷新时间, 0为手动刷新、以及插件的界面xml
 
  3. AndroidManifest.xml  注册插件
[html] 
<!-- 注册该插件 -->  
       <receiver android:name="MyWidgetProvider" >  
           <intent-filter >  
               <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />  
               <action android:name="com.wd.appWidgetUpdate" >  
               </action>  
           </intent-filter>  
  
           <meta-data  
               android:name="android.appwidget.provider"  
               android:resource="@xml/mywidget" />  
       </receiver>  
 
 
<action android:name="com.wd.appWidgetUpdate" >  这一段是向系统注册一个广播, 我们会在逻辑处理时将该广播发送给AppWidgetProvider的更新方法, 以实现手动刷新。
 
那么完成上面三部基本上就可以显示一个插件在桌面上了。
 
如果我们想让插件显示的数字每秒加一的话, 我们需要做后台处理
[java] 
public class MyWidgetProvider extends AppWidgetProvider  
{  
    private static Timer myTimer;  
    private static int index = 0;  
      
    //定义我们要发送的事件  
    private final String broadCastString = "com.wd.appWidgetUpdate";   
      
    @Override  
    public void onDeleted(Context context, int[] appWidgetIds)  
    {  
        // TODO Auto-generated method stub  
        super.onDeleted(context, appWidgetIds);  
          
        System.out.println("onDeleted");  
    }  
      
      
  
    @Override  
    public void onEnabled(Context context)  
    {  
        System.out.println("onEnabled");  
        // TODO Auto-generated method stub  
        super.onEnabled(context);  
          
        //在插件被创建的时候这里会被调用, 所以我们在这里开启一个timer 每秒执行一次  
        MyTask mMyTask = new MyTask(context);  
        myTimer = new Timer();  
        myTimer.schedule(mMyTask, 1000, 1000);  
        System.out.println("onEnabled2");  
    }  
  
  
  
    @Override  
    public void onUpdate(Context context, AppWidgetManager appWidgetManager,  
            int[] appWidgetIds)  
    {  
        System.out.println("onUpdate");  
        // TODO Auto-generated method stub  
        super.onUpdate(context, appWidgetManager, appWidgetIds);  
    }  
      
      
      
    @Override  
    public void onReceive(Context context, Intent intent)  
    {  
        //当判断到是该事件发过来时, 我们就获取插件的界面, 然后将index自加后传入到textview中  
        System.out.println("onReceive");  
        if(intent.getAction().equals(broadCastString))  
        {  
            index++;  
              
            RemoteViews rv = new RemoteViews(context.getPackageName(), R.layout.widget_layout);  
            rv.setTextViewText(R.id.update, Integer.toString(index));  
              
            //将该界面显示到插件中  
            AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);  
            ComponentName componentName = new ComponentName(context,MyWidgetProvider.class);  
            appWidgetManager.updateAppWidget(componentName, rv);  
        }     
        // TODO Auto-generated method stub  
        super.onReceive(context, intent);  
    }  
  
  
      
    class MyTask extends TimerTask  
    {  
  
        private Context mcontext = null;  
        private Intent intent = null;  
          
        public MyTask(Context context) {  
              
            //新建一个要发送的Intent  
            mcontext = context;  
            intent = new Intent();  
            intent.setAction(broadCastString);  
        }  
        @Override  
        public void run()  
        {  
            System.out.println("2");  
            //发送广播(由onReceive来接收)  
            mcontext.sendBroadcast(intent);  
        }  
          
    }  
}  
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值