◆桌面小部件(AppWidget)
▲創(chuàng)建步驟:
§1.創(chuàng)建桌面小部件的布局,xml文件;
§2.創(chuàng)建元數(shù)據(jù)來描述桌面小部件的具體特性;官方單元格大泄迮拧:手機:70n-30;平板:87n-30挖炬;創(chuàng)建一個xml文件夾,xml類型為AppWidget Provider;
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
android:initialLayout="@layout/appwidget_layout" //引用創(chuàng)建的布局文件
android:minHeight="40dp"
android:minWidth="250dp" >
</appwidget-provider>
§3.創(chuàng)建AppWidgetProvider的子類鼠渺;創(chuàng)建一個類繼承AppWidgetProvider即可
§4. 注冊該子類;
<receiver android:name=".類名">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE"/> //沒有提示眷细,須手寫
<intent-filter>
<meta-data android:name="android.appwidget.provider"
android:resource="@xml/資源名"/>
</receiver>
●重寫AppWidgetProvider方法:(可只繼承不重寫)
onReceive:接收對桌面小部件操作的廣播拦盹;
onEnabled:在向桌面添加該部件的第一個實例時執(zhí)行;
onUpdate:在向桌面添加部件實例時執(zhí)行
onDeleted:從桌面移除部件的實例時執(zhí)行
onDisabled:從桌面移除最后一個實例時執(zhí)行
◆ 桌面部件實例的更新:
§1溪椎、 創(chuàng)建RemoteViews普舆,并設置RemoteViews中的各控件的值
○ 構造方法: RemoteViews(String pkgName,int layoutRes)
○ 主要方法:
void setTextViewText(int resId,CharSequence text)//設置文本內(nèi)容
void setOnClickPendingIntent(int resId,PendingIntent intent):設置事件
...
§2、 獲取要更新的部件實例的id池磁,如果更新桌面部件的所有實例的界面(直接使用類名)
§3奔害、 AppWidgetManager的實例;可自己創(chuàng)建AppWidgetManager manager = AppWidgetManager.getInstance(context);在重寫的public void onUpdate(Context context, AppWidgetManager appWidgetManager,int[] appWidgetIds)方法中包含了該實例地熄,可直接引用华临。
§4、 調用AppWidgetManager的更新方法
void updateAppWidget(int id,RemoteViews views)
void updateAppWidget(int[] ids,RemoteViews views)端考;//ids為添加該類多個小部件后的id,但內(nèi)部為最后一次添加的小部件的id;
void updateAppWidget(ComponentName provider,RemoteViews views)
★ 注意:可在 appwidget-provider 中設置自動更新時間間隔:android:updatePeriodMillis設置更新的時間雅潭,2.0前可設置每秒更新揭厚;但在2.0后不能小于30分鐘;
◆ 桌面小部件關聯(lián)Activity
1扶供、創(chuàng)建Activity的子類
1)獲取appWidgetId
2)根據(jù)id 更新該桌面部件實例的內(nèi)容
3)設置返回值筛圆,將appWidgetId返回
2、注冊
<activity android:name="類名">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_CONFIGURE"/>
</intent-filter>
</activity>
3椿浓、在元數(shù)據(jù)中添加屬性
android:configure="類名(完全限定名)"
№1. 設置該部件配置的Activity;在元數(shù)據(jù)的xml文件添加配置: android:configure="類名(完全限定名)"
android:configure = "com.fanfan.a1002.MainActivity"
★ 若需要用戶在添加小部件時對其進行初始化操作太援,則在該Activity中取出用戶輸入的數(shù)據(jù),傳遞到一個service中扳碍,對相應的部件進行更新提岔;在這個過程中需要對哪個部件傳遞的參數(shù)及更新進行判斷;
△a. 先取出正在執(zhí)行的部件的id;
appwidgetId = getIntent().getIntExtra( AppWidgetManager.EXTRA_APPWIDGET_ID,
AppWidgetManager.INVALID_APPWIDGET_ID);//參數(shù)為標記的id的key值笋敞,
及相應的默認值碱蒙;
△b.判斷當前id是否合法:若不合法,就將結果設置到結果中:
if (appwidgetId == AppWidgetManager.INVALID_APPWIDGET_ID) { //無效id
setResult(RESULT_CANCELED);// 設置結果參數(shù)
finish();
}
△c.在啟動Service后夯巷,返回當前部件的id,放入到結果參數(shù)中:
Intent data = new Intent();
data.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appwidgetId);
setResult(RESULT_OK, data);// 將數(shù)據(jù)放入到結果中赛惩,再對其進行判斷
△d.在配置清單Mainfest文件中設置該Activity的過濾器:
<intent-filter>
<actionandroid:name="android.appwidget.action.APPWIDGET_CONFIGURE" />
</intent-filter>
△e.創(chuàng)建AppWidgetProvider的子類并注冊
駐留廣播:
常駐系統(tǒng)之中;故較消耗內(nèi)存趁餐,在用完該廣播后需要移除該廣播喷兼;在Android內(nèi)存中電量不足是一個一直存在的駐留廣播后雷。
sendStickyBroadcast(intent);//發(fā)送駐留廣播
removeStickyBroadcast(intent);//移除駐留廣播
№須添加權限:<uses-permission android:name="android.permission.BROADCAST_STICKY" />
有序廣播:
可設置廣播的優(yōu)先級褒搔。
發(fā)送:sendOrderedBroadcast(intent, receiverPermission)
可設置一個0-1000的數(shù)字表示優(yōu)先級。1000最高喷面。優(yōu)先級越高,則優(yōu)先接收廣播走孽;★№[在開機時就加載一個Service,并在其中注冊一個廣播,是應用層可取得的優(yōu)先級最高的廣播锐极⊙夭拢可用于短信攔截,電話攔截困食,防騷擾等边翁;]
具體步驟為:
§1、創(chuàng)建一個廣播接收器Myreceiver,在其清單文件中配置可接收開機廣播:
<action android:name="android.intent.action.BOOT_COMPLETED" /> 硕盹;
§2符匾、在其onReceive(..)方法中接收到開機廣播后就啟動一個Service:
if (Intent.ACTION_BOOT_COMPLETED.equals(action)) {
Intent service = new Intent(context, MyService.class);
context.startService(service);
}
§3、在MyService中再去動態(tài)注冊另一個廣播接收器瘩例,并設其優(yōu)先級為1000啊胶,則可取到應用層優(yōu)先級最高的廣播接收器甸各。
★№ [在電話呼出時會發(fā)出一個廣播,電話號碼則是在廣播后追加的數(shù)據(jù)焰坪,可獲取這個數(shù)據(jù)并修改趣倾。]
● 設置優(yōu)先級:在清單中: < intent-filter android:priority = "1000" >
在程序中: filter .setpPriority(1000);
△ BroadcastReceiver其他方法:
▲ boolean isOrderedBroadcast;是否為有序廣播,是有序廣播才攔截有意義
▲ void abortBroadcast;//用于將攔截到的廣播注銷某饰;否則繼續(xù)存在儒恋。
▲ void setResultCode(int code):重新修改code,為系統(tǒng)固定值黔漂,用于標記結果成功( RESULT_OK )或失敗( RESULT_CANCELED) 诫尽、第一次使用( RESULT_FIRST_USER)
▲ void setResultData(String data):攔截到廣播后修改數(shù)據(jù);
▲ void setResultExtras(Bundle extras)
▲ int getResultCode():獲取code
▲ String getResultData():獲取追加的數(shù)據(jù)瘟仿;
▲ Bundle getResultExtrasx(boolean b)
◆電話技術:
在Andrid中將聯(lián)系人信息保存為SQLite數(shù)據(jù)庫箱锐,存放在/data/data/com.android.providers.contacts目錄下。常用有表有:raw_contacts(保存聯(lián)系人的id和姓名等)劳较、data(聯(lián)系人詳細信息)驹止、mimetype(各種信息類型對應的id);
▲添加聯(lián)系人:
△1獲取raw_contacts表的uri, Uri contactUri = RawContacts.CONTENT_URI;
△2向raw_contacts表中插入一個空行(values未賦值),Uri retUri = cr.insert(contactUri, values);
△3獲取到一個rawId, long raw_contact_id = ContentUris.parseId(retUri);然后根據(jù)此Id向data表中插入聯(lián)系的詳細信息观蜗;data表的uri: Uri dataUri = Data.CONTENT_URI;
△4插入的信息至少應包括4部分:
※要插入行的rawId:values.put(Data.RAW_CONTACT_ID, raw_contact_id);
※插入的信息類型:values.put(Data.MIMETYPE, "vnd.android.cursor.item/phone_v2");可用封裝類替代:values.put(Phone.MIMETYPE, Phone.CONTENT_ITEM_TYPE);
※插入的信息數(shù)據(jù):values.put(Data.DATA1, "0102365478"); values.put(Phone.NUMBER, "135689947863");
※若是電話或郵箱等可能包含多個字段應指定:values.put(Data.DATA2, 1); values.put(Phone.TYPE, Phone.TYPE_MOBILE);
☆其他封裝對象:姓名:StructuredName臊恋;郵件:Email等,都位于CommonDataKinds類中墓捻;
★獲取電話聯(lián)系人信息:
△1先從Contacts中獲取rawId和姓名display_name抖仅;String[] projection = { Contacts._ID, Contacts.DISPLAY_NAME };
★№要獲取聯(lián)系人頭像有專門的方法:
Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, id);
InputStream stream = Contacts.openContactPhotoInputStream(cr, contactUri);
Bitmap bmp = BitmapFactory.decodeStream(stream);
△2[再根據(jù)聚合rewId查詢其他信息:一般為限定條件為數(shù)據(jù)及數(shù)據(jù)類型。]
★§ 要讀取聯(lián)系人須添加權限:
<uses-permission android:name="android.permission.READ_CONTACTS" />
要寫入聯(lián)系人須添加權限:
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
博客地址:Android學習筆記(五)