編輯:關於Android編程
在屏幕上添加Widget:或長按屏幕空白處,或找到WidgetPreview App選擇。原生系統4.0以下使用長按方式,4.0及以上 打開WIDGETS
創建Widget的一般步驟:
在menifest中
Widget描述文件:timer_widget_provider.xml
package com.stone.ui; import java.util.Arrays; import com.stone.R; import com.stone.service.TimerWidgetService; import android.app.PendingIntent; import android.appwidget.AppWidgetHost; import android.appwidget.AppWidgetManager; import android.appwidget.AppWidgetProvider; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.text.format.DateUtils; import android.widget.RemoteViews; /* * AppWidgetProvider 必須要接收android.appwidget.action.APPWIDGET_UPDATE 廣播 * */ public class TimerWidgetProvider extends AppWidgetProvider { @Override //更新部件時調用,在第1次添加部件時也會調用 public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { super.onUpdate(context, appWidgetManager, appWidgetIds); System.out.println("onUpdate widget:" + Arrays.toString(appWidgetIds)); /* * 構造pendingIntent發廣播,onReceive()根據收到的廣播,更新 */ Intent intent = new Intent(context, TimerWidgetService.class); PendingIntent pendingIntent = PendingIntent.getService(context, 0, intent, 0); RemoteViews rv = new RemoteViews(context.getPackageName(), R.layout.timer_widget); rv.setOnClickPendingIntent(R.id.start_stop, pendingIntent); appWidgetManager.updateAppWidget(appWidgetIds, rv); } @Override //部件從host中刪除 public void onDeleted(Context context, int[] appWidgetIds) { super.onDeleted(context, appWidgetIds); System.out.println("onDeleted widget"); } @Override //第1次創建時調用,之後再創建不會調用 public void onEnabled(Context context) { super.onEnabled(context); System.out.println("onEnabled widget"); } @Override //當最後一個部件實例 被刪除時 調用 用於清除onEnabled執行的操作 public void onDisabled(Context context) { super.onDisabled(context); System.out.println("onDisabled widget"); } @Override // public void onReceive(Context context, Intent intent) { super.onReceive(context, intent); System.out.println("onReceive widget"); /* * 接收 在其他組件或activity或service中發送這些廣播 */ if (intent.getAction().equals("com.stone.action.start")) { long time = intent.getLongExtra("time", 0); updateWidget(context, time); System.out.println("receive com.stone.action.start"); } } private void updateWidget(Context context, long time) { //RemoteViews處理異進程中的View RemoteViews rv = new RemoteViews(context.getPackageName(), R.layout.timer_widget); System.out.println("time=" + time); rv.setTextViewText(R.id.counter, DateUtils.formatElapsedTime(time / 1000)); AppWidgetManager am = AppWidgetManager.getInstance(context); int[] appWidgetIds = am.getAppWidgetIds(new ComponentName(context, TimerWidgetProvider.class)); am.updateAppWidget(appWidgetIds, rv);//更新 所有實例 } }
package com.stone.service; import android.app.Service; import android.content.Intent; import android.os.IBinder; public class TimerWidgetService extends Service { @Override public IBinder onBind(Intent intent) { return null; } @Override public void onCreate() { super.onCreate(); } @Override public int onStartCommand(Intent intent, int flags, int startId) { /* * do some thing */ //發送廣播通知 widget 更新 狀態 sendBroadcast(new Intent("com.stone.action.start").putExtra("time", System.currentTimeMillis())); return Service.START_STICKY; } }
下面是開始Android編程的好方法:找一些與你想做事情類似的代碼調整它,嘗試讓它做你像做的事情經歷問題使用StackOverflow解決問題對每個你像添加的特征重復上述
很多時候需要先判斷當前用戶的網絡,才會繼續之後的一些處理邏輯。但網絡類型獲取這一塊,我用我自己的的手機調試時遇到一些問題,這裡記錄一下。一加手機一代,移動4G 網絡,得到
為了在 Android 應用中錄制聲音,Android提供了 MediaRecorder 類,關於MediaRecorder的詳解大家可以參考《Android開發之Med
我們常用context.startService()來啟動一個service,下面來分析一下這個service的啟動過程,下圖是service啟動的序列圖: st