Android开发——桌面插件

来源:互联网 发布:java的重载和重写 编辑:程序博客网 时间:2024/05/01 02:54
开发一个在手机桌面上显示的插件需要3个步骤: 

  1. 继承AppWidgetProvider 

  2. 编写widget的界面xml, 编写mywidget属性xml 

  3. AndroidManifest.xml  注册插件  


以自增的数字为例。 

  

1. 继承AppWidgetProvider 

 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 
<?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  
<?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  注册插件  

 <!-- 注册该插件 --> 
        <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的更新方法, 以实现手动刷新。  

  至此基本实现预想功能!!!!!  

让插件显示的数字/1000ms+1需做后台处理 

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);   
        }   
           
    }   
}   

原创粉丝点击