Android學習筆記(五)

◆桌面小部件(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學習筆記(五)

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末砖第,一起剝皮案震驚了整個濱河市撤卢,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌梧兼,老刑警劉巖放吩,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異羽杰,居然都是意外死亡渡紫,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進店門考赛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來惕澎,“玉大人,你說我怎么就攤上這事颜骤∵蠛恚” “怎么了?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長欣喧。 經(jīng)常有香客問我腌零,道長,這世上最難降的妖魔是什么唆阿? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任益涧,我火速辦了婚禮,結果婚禮上驯鳖,老公的妹妹穿的比我還像新娘闲询。我一直安慰自己,他們只是感情好浅辙,可當我...
    茶點故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布扭弧。 她就那樣靜靜地躺著,像睡著了一般记舆。 火紅的嫁衣襯著肌膚如雪鸽捻。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天泽腮,我揣著相機與錄音御蒲,去河邊找鬼。 笑死诊赊,一個胖子當著我的面吹牛厚满,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播碧磅,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼碘箍,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了鲸郊?” 一聲冷哼從身側響起丰榴,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎秆撮,沒想到半個月后多艇,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡像吻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了复隆。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拨匆。...
    茶點故事閱讀 40,127評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖挽拂,靈堂內(nèi)的尸體忽然破棺而出惭每,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布台腥,位于F島的核電站宏赘,受9級特大地震影響,放射性物質發(fā)生泄漏黎侈。R本人自食惡果不足惜察署,卻給世界環(huán)境...
    茶點故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望峻汉。 院中可真熱鬧贴汪,春花似錦、人聲如沸休吠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽瘤礁。三九已至阳懂,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間柜思,已是汗流浹背岩调。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留酝蜒,地道東北人誊辉。 一個月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像亡脑,于是被迫代替她去往敵國和親堕澄。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,066評論 2 355

推薦閱讀更多精彩內(nèi)容