Android學習從零單排之BroadCastReceiver
讀了那麼多年的書讓我明白一個道理。人要穩重,不要想到啥就做啥。做一行越久即使你不會,幾年之後慢慢的你也會了,加上一點努力你或許你能成爲別人眼中的專家。
注:本blog一部分是Android廣播內容(因爲廣播內容太少了),一部分是AndroidUI內容。
BroadCastReceiver是什麼
Android應用程序,會把一系列事件(電量不足、電量充滿、開機啓動完成)作爲一個廣播消息發送其他的接收者;當然自己也可以定義一些廣播事件發送出去,然後我們需要自己寫一個廣播接受者,用來接受系統發出的廣播或者自己定義的廣播,來處理某些數據。
廣播的特點:
即使廣播接收者沒有運行,當廣播消息到達的時候,系統會自動啓動廣播接收者的進程,調用onReceive方法,接收消息。
ip撥號器開發步驟
1、寫一個類繼承自BroadcastReceiver,並在清單文件中,配置撥打電話的action,和添加權限。
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/>
<receiver android:name=".AcceptBroadcast">
<intent-filter>
<!--當撥打電話出去的時候,發送此廣播-->
<action android:name="android.intent.action.NEW_OUTGOING_CALL"/>
</intent-filter>
</receiver>
2、在AcceptBroadcast類中重寫onReceive方法,監聽撥打電話的狀態
//當接受廣播的時候調用
@Override
public void onReceive(Context context, Intent intent) {
String string = context.getSharedPreferences("config", Context.MODE_PRIVATE).getString("number", "");
System.out.println("你打電話了……");
//獲取data數據
String resultData = getResultData();
Log.d("Hsia",resultData);
if (resultData.startsWith("0")){
setResultData(string+resultData);
}
}
短信監聽器開發步驟
1、寫一個類繼承自BroadcastReceiver,並在清單文件中,配置撥打電話的action,和添加權限。
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
<receiver android:name=".SMSBroadcast">
<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
2、在SMSBroadcast類中重寫onReceive方法,監聽短信內容和短信號碼
@Override
public void onReceive(Context context, Intent intent) {
//pdus是根據開發文檔提示或系統上層源碼查看得知
Object[] pdus = (Object[]) intent.getExtras().get("pdus");
for (Object obj: pdus) {
//獲取SmsMessage對象
SmsMessage fromPdu = SmsMessage.createFromPdu((byte[]) obj);
String address = fromPdu.getOriginatingAddress();
String body = fromPdu.getMessageBody();
Log.d(TAG,"短信號碼:"+address);
Log.d(TAG,"短信內容:"+body);
}
}
監聽開機狀態開發步驟
1、寫一個類繼承自BroadcastReceiver,並在清單文件中,配置撥打電話的action,和添加權限。
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<receiver android:name=".AutoBootBroadcast">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
2、在AutoBootBroadcast類中重寫onReceive方法,監聽監聽開機狀態,並開啓主界面。
@Override
public void onReceive(Context context, Intent intent) {
//開機啓動的廣播
Log.d(TAG,"您的手機開機了");
// Intent intent1 = intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
// Intent intent1 = new Intent(context, MainActivity.class);
//必須配置
// intent1.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
// context.startActivity(intent1);
Log.d(TAG,"鏈式寫法");
context.startActivity(new Intent(context,MainActivity.class).setFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
}
發送自定義無序廣播
1、發送自定義廣播
public void sendbroadcast(View v){
Intent intent = new Intent();
//設置Action動作
intent.setAction("Hsia");
intent.putExtra("name","Hsia");
sendBroadcast(intent);
}
2、寫一個類,接受自定義廣播
@Override
public void onReceive(Context context, Intent intent) {
String name = (String) intent.getExtras().get("name");
Log.d(TAG,"你發送了一個自定義廣播"+name);
}
發送自定義有序廣播(可被攔截)
1、發送一條自定義有序廣播
public void sendBroadcast(View view){
Intent intent = new Intent();
intent.setAction("HsiaH");
//發送一個有序的廣播
//intent 意圖
//permission 指定接收者需要添加了權限
//resultReceiver 指定哪個廣播接收者最後接到消息
//scheduler 消息處理器
//initialCode 給消息指定初始代碼
//initialData 指定消息的數據
//initialExtras 指定額外的參數
sendOrderedBroadcast(intent, null, new FinalAcceptBroadcast(), null,1,"有序廣播1+1=2",null);
}
2、寫多個廣播接受者,用來接受廣播,並在清單文件中配置層級關係。
<receiver android:name=".FirstAcceptBroadcast">
<!--代表的層級關係-->
<intent-filter
android:priority="1000">
<action android:name="HsiaH"></action>
</intent-filter>
</receiver>
<receiver android:name=".SecondAcceptBroadcast">
<intent-filter
android:priority="800">
<action android:name="HsiaH"></action>
</intent-filter>
</receiver>
<receiver android:name=".ThirdAcceptBroadcast">
<intent-filter
android:priority="500">
<action android:name="HsiaH"></action>
</intent-filter>
</receiver>
<receiver android:name=".FinalAcceptBroadcast">
<intent-filter
android:priority="300">
<action android:name="HsiaH"></action>
</intent-filter>
</receiver>
3、隨便看一個廣播接受者
@Override
public void onReceive(Context context, Intent intent) {
//終止廣播往下傳遞
abortBroadcast();
String resultData = getResultData();
setResultData("有序廣播2+2=4");
Toast.makeText(context,resultData,Toast.LENGTH_SHORT).show();
}
4、最後還可以定義一個最終的廣播接受者,用來監視廣播下發的數據變化。
@Override
public void onReceive(Context context, Intent intent) {
String resultData = getResultData();
Toast.makeText(context, "最終接受廣播:"+resultData, Toast.LENGTH_SHORT).show();
}
以下是AndroidUI部分內容
Android自定義樣式
1、在style中定義樣式
<!--我的主題,繼承自AppTheme-->
<style name="MyTheme" parent="AppTheme">
<item name="android:background">#ff0</item>
<item name="colorPrimaryDark">#ff0</item>
</style>
<!--定義自定義樣式-->
<style name="MyStyle">
<item name="android:layout_width">wrap_content</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:textSize">23sp</item>
<item name="android:textColor">#ff0000</item>
<item name="android:layout_centerInParent">true</item>
</style>
2、在layout文件中引用
<activity android:name=".MainActivity"
android:theme="@style/MyTheme">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!--引用自定義樣式-->
<TextView
style="@style/MyStyle"
android:text="Hello World!" />
Android中國際化
1、res目錄下創建values—(國家編碼)
2、在自己創建的vaules—(國家編碼)文件中,複製strings.xml文件,並更改裏面的字符串。
Android中定義幀動畫
步驟
1、在drawable目錄下新建layout文件,根節點爲animation-list,item爲你的資源文件。
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="true">
<item android:drawable="@drawable/rocket_thrust1" android:duration="200" />
<item android:drawable="@drawable/rocket_thrust2" android:duration="200" />
<item android:drawable="@drawable/rocket_thrust3" android:duration="200" />
</animation-list>
2、在Activity中找到imageview控件,並設置背景資源,強制轉爲AnimationDrawable,最後start動畫。
rocketImage.setBackgroundResource(R.drawable.rocket_drawable);
rocketAnimation = (AnimationDrawable) rocketImage.getBackground();
rocketAnimation.start();
Android補間動畫
//漸變動畫
AlphaAnimation(1.0f,0.1f);
//旋轉動畫
RotateAnimation(0,360, Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f);
//縮放動畫
ScaleAnimation(0.1f, 2.0f, 0.1f, 2.0f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
//位移動畫
new TranslateAnimation(Animation.RELATIVE_TO_PARENT, -0.5f, Animation.RELATIVE_TO_PARENT, 0.5f, Animation.RELATIVE_TO_PARENT, -0.5f, Animation.RELATIVE_TO_PARENT, 0.5f);
//動畫集合
AnimationSet(false);
Android中常用的對話框
因對話框基於AlertDialog這個類,所以只寫了多選對話框代碼,普通對話框和單選對話框以此類推。
//單選對話框
builder.setSingleChoiceItems(item, 1, new DialogInterface.OnClickListener() {
//多選對話框
private void doubleMyDialog() {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("你喜歡喫那些食物?");
final String[] foods = {"大米","白菜","牛肉","熱狗","披薩","火腿","豆腐"};
final boolean[] isCheck = {true,false,true,false,true,false,false};
//多選對話框
builder.setMultiChoiceItems(foods, isCheck, new DialogInterface.OnMultiChoiceClickListener() {
@Override
public void onClick(DialogInterface dialog, int which, boolean isChecked) {
//取反
isCheck[which] = isChecked;
}
});
//設置確定點擊事件
builder.setPositiveButton("確定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < isCheck.length; i++) {
if (isCheck[i]) {
String food = foods[i];
//拼接取出的水果
sb.append(food + " ");
}
}
Toast.makeText(getApplicationContext(), "你喜歡喫" + sb.toString(), Toast.LENGTH_SHORT).show();
dialog.dismiss();
}
});
builder.show();
}
關於作者
- Email:[email protected]
- 項目地址:https://github.com/swordman20/Hsia02BroadcastDemo