02Android學習從零單排之BroadcastReceiver

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章