◆桌面小部件(AppWidget)
▲創(chuàng)建步驟:
§1.創(chuàng)建桌面小部件的布局,xml文件;
§2.創(chuàng)建元數(shù)據(jù)來描述桌面小部件的具體特性;官方單元格大?。菏謾C: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,并設(shè)置RemoteViews中的各控件的值
○ 構(gòu)造方法: RemoteViews(String pkgName,int layoutRes)
○ 主要方法:
void setTextViewText(int resId,CharSequence text)//設(shè)置文本內(nèi)容
void setOnClickPendingIntent(int resId,PendingIntent intent):設(shè)置事件
...
§2、 獲取要更新的部件實例的id,如果更新桌面部件的所有實例的界面(直接使用類名)
§3、 AppWidgetManager的實例;可自己創(chuàng)建AppWidgetManager manager = AppWidgetManager.getInstance(context);在重寫的public void onUpdate(Context context, AppWidgetManager appWidgetManager,int[] appWidgetIds)方法中包含了該實例,可直接引用。
§4、 調(diào)用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 中設(shè)置自動更新時間間隔:android:updatePeriodMillis設(shè)置更新的時間,2.0前可設(shè)置每秒更新;但在2.0后不能小于30分鐘;
◆ 桌面小部件關(guān)聯(lián)Activity
1、創(chuàng)建Activity的子類
1)獲取appWidgetId
2)根據(jù)id 更新該桌面部件實例的內(nèi)容
3)設(shè)置返回值,將appWidgetId返回
2、注冊
<activity android:name="類名">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_CONFIGURE"/>
</intent-filter>
</activity>
3、在元數(shù)據(jù)中添加屬性
android:configure="類名(完全限定名)"
№1. 設(shè)置該部件配置的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是否合法:若不合法,就將結(jié)果設(shè)置到結(jié)果中:
if (appwidgetId == AppWidgetManager.INVALID_APPWIDGET_ID) { //無效id
setResult(RESULT_CANCELED);// 設(shè)置結(jié)果參數(shù)
finish();
}
△c.在啟動Service后,返回當前部件的id,放入到結(jié)果參數(shù)中:
Intent data = new Intent();
data.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appwidgetId);
setResult(RESULT_OK, data);// 將數(shù)據(jù)放入到結(jié)果中,再對其進行判斷
△d.在配置清單Mainfest文件中設(shè)置該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);//移除駐留廣播
№須添加權(quán)限:<uses-permission android:name="android.permission.BROADCAST_STICKY" />
有序廣播:
可設(shè)置廣播的優(yōu)先級。
發(fā)送:sendOrderedBroadcast(intent, receiverPermission)
可設(shè)置一個0-1000的數(shù)字表示優(yōu)先級。1000最高。優(yōu)先級越高,則優(yōu)先接收廣播;★№[在開機時就加載一個Service,并在其中注冊一個廣播,是應用層可取得的優(yōu)先級最高的廣播??捎糜诙绦艛r截,電話攔截,防騷擾等;]
具體步驟為:
§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)注冊另一個廣播接收器,并設(shè)其優(yōu)先級為1000,則可取到應用層優(yōu)先級最高的廣播接收器。
★№ [在電話呼出時會發(fā)出一個廣播,電話號碼則是在廣播后追加的數(shù)據(jù),可獲取這個數(shù)據(jù)并修改。]
● 設(shè)置優(yōu)先級:在清單中: < intent-filter android:priority = "1000" >
在程序中: filter .setpPriority(1000);
△ BroadcastReceiver其他方法:
▲ boolean isOrderedBroadcast;是否為有序廣播,是有序廣播才攔截有意義
▲ void abortBroadcast;//用于將攔截到的廣播注銷;否則繼續(xù)存在。
▲ void setResultCode(int code):重新修改code,為系統(tǒng)固定值,用于標記結(jié)果成功( 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)
◆電話技術(shù):
在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)系人須添加權(quán)限:
<uses-permission android:name="android.permission.READ_CONTACTS" />
要寫入聯(lián)系人須添加權(quán)限:
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
博客地址:Android學習筆記(五)