2015年3月30日 星期一

【Android】Widget製作時鐘

這次要來用Widget來製作一個小時鐘,主要會用到下面幾個項目知識

  • Widget
  • Handler
  • Service
我們的目標是顯示現在的時刻
Ex : 2015/05/12 17:00

需要在code裡不斷的重新更新時間,下面這段code就是new出一個新的時間並設定我們需要的格式。

new SimpleDateFormat( "yyyy/MM/dd HH:mm:ss" ).format( new Date())

在Widget的部分主要是要intent Service交由Service去處理我們的每秒更新與背景。

Widget.java

public class SmsWidget extends AppWidgetProvider {
   
    Context context_main ;
    AppWidgetManager app_manager;
    int []appWidgetId;
    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
       
        
        app_manager = appWidgetManager;
        context_main = context;
        appWidgetId = appWidgetIds;

       //new出一個 intent並將Widget的context傳入
        Intent intent = new Intent(context_main,WidgetService.class);
 //Intent執行service服務
context_main.startService(intent);


    }

    @Override
    public void onEnabled(Context context) {
       
    }

    @Override
    public void onDisabled(Context context) {
        //當WidgetDisable時關閉service服務
        Intent intent = new Intent(context_main,WidgetService.class);
        context_main.stopService(intent);
    }
}


那我們要如何不斷的new出新的時間並更新widget的view ?
其實只要用handler來處理即可,並搭配Service讓code在背景執行,執行一次就更新一秒。


Service.java

public class WidgetService extends Service {
    private Handler mHandlerBoss = null;
    private HandlerThread mHandlerEmployee = null;
    private String EmployeeName = "John";
    public WidgetService() {
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        //service結束,結束handler
        mHandlerBoss.removeCallbacks(mRunnable);
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        //建立Handler
        //Handler簡單來說就是需要老闆、員工、工作
        //建立一個員工
        mHandlerEmployee = new HandlerThread(EmployeeName);
        //員工上班
        mHandlerEmployee.start();
        //建立一個老闆,老闆聘員工上班
        mHandlerBoss = new Handler(mHandlerEmployee.getLooper());
        //老闆指派工作給員工
        mHandlerBoss.post(mRunnable);
        return super.onStartCommand(intent, flags, startId);
    }
    private Runnable mRunnable = new Runnable() {
        @Override
        public void run() {
            //更新Widget畫面
            buildUpdate();
            //每秒跑一次
            mHandlerBoss.postDelayed(this,1000);
        }
    };
    private void buildUpdate()
    {
        
        RemoteViews view = new RemoteViews(getPackageName(), R.layout.sms_widget);
        view.setTextViewText(R.id.appwidget_text, new SimpleDateFormat( "yyyy/MM/dd HH:mm:ss" ).format( new Date()));

        ComponentName thisWidget = new ComponentName(this, SmsWidget.class);

        AppWidgetManager manager = AppWidgetManager.getInstance(this);

        manager.updateAppWidget(thisWidget, view);
    }
    @Override
    public IBinder onBind(Intent intent) {
        // TODO: Return the communication channel to the service.
        throw new UnsupportedOperationException("Not yet implemented");
    }
}

編譯成功後就能夠在,手機裡將Widget拉出來使用。

參考連結:
Widget Update http://stackoverflow.com/questions/4866305/android-widget-update
背景執行 http://cooking-java.blogspot.tw/2010/04/android-service.html



沒有留言:

張貼留言