屏幕適配和廣播

屏幕適配:
盡量用相對布局和線性布局
最好不要用相對布局
為了更好地適配我們用九圖 畫圖

列如:480x320 和 320x240

image.png

創(chuàng)建一個項目:
在res 下創(chuàng)建 文件夾 layout-480x320 和 layout-320x240

layout-480x320 下的activity_main.xml**********代碼如下


···
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="${relativePackage}.${activityClass}" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
>
<TextView
android:layout_width="@dimen/x160"
android:layout_height="wrap_content"
android:text="姓名"
android:textSize="20sp"
/>
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"

        />
</LinearLayout>
<Button 
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="保存"
   android:background="@drawable/img1"
    android:layout_gravity="center_horizontal"
    />
 <ImageView 
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/img2"
     />

</LinearLayout>

···
**********320x240**************下代碼
···
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="${relativePackage}.${activityClass}" >

<TextView
    android:layout_width="@dimen/x160"
    android:layout_height="wrap_content"
    android:text="姓名"
    android:textSize="20sp" 
    android:background="#00ff00"
    />

<EditText
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_horizontal"
    android:text="保存" 
    android:background="@drawable/img1"
    />
<ImageView 
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/img2"
    
    />

</LinearLayout>
···
****************效果圖****************

image.png

手機屏幕分類和像素密度的對應(yīng)關(guān)系:
image.png

*****點九 自動拉伸圖:*****
image.png

**********最終效果圖***********
image.png

一乳蛾、廣播接收者概念(****BroadcastReceiver****)****&****為什么需要廣播接收者

1、 BroadcastReceiver用來接收sendBroadcast()方法發(fā)出來的廣播鄙币,可以通過Intent傳遞數(shù)據(jù)屡久,它是一個抽象類

2、廣播特點:數(shù)據(jù)的傳遞方向是單向的爱榔,調(diào)到固定的頻率

3被环、安卓的廣播作用范圍有限,只在當前手機里有效

4详幽、系統(tǒng)把一些重要的操作筛欢,通過廣播的形式通知給所有的應(yīng)用

---------------------IP撥號器--------
廣播接收器必須繼承BroadcastReceiver 并添加未實現(xiàn)的方法浸锨。
在清單文件里注冊:
···
<receiver android:name=".DiaReceiver">
<intent-filter >
<action android:name="android.intent.action.NEW_OUTGOING_CALL"/>
</intent-filter>
</receiver>
···
需要處理外撥電話權(quán)限:
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/>


創(chuàng)建一個項目
寫一個類繼承BroadcastReceiver
******如**********
···
//Ip撥號器的廣播接收者
public class DiaReceiver extends BroadcastReceiver{

@Override
public void onReceive(Context context, Intent intent) {
            
            //獲取電話號
            String number = getResultData();
        //  Log.e("TAG", "打電話"+number);
            //設(shè)置撥打電話號
            setResultData("17951"+number);
}

}

···
****監(jiān)聽SD卡掛在狀態(tài)**************
···
//監(jiān)聽SD卡掛載狀態(tài)的廣播
public class SDRecevier extends BroadcastReceiver{

@Override
public void onReceive(Context context, Intent intent) {
         String action = intent.getAction();
         if ("android.intent.action.MEDIA_MOUNTED".equals(action)) {
            Log.e("TAG", "SDCard已安裝");
        }else if("android.intent.action.MEDIA_UNMOUNTED".equals(action)){
            Log.e("TAG", "SDCard已卸載");
            
        }
}

}

···
同樣也需要在清單文件里注冊
···
<receiver android:name=".SDRecevier">
<intent-filter >
<action android:name="android.intent.action.MEDIA_MOUNTED"/>
<action android:name="android.intent.action.MEDIA_UNMOUNTED"/>
<data android:scheme="file"/>
</intent-filter>
</receiver>
···
******************效果圖********


*****

***********短信監(jiān)聽***********
···
//短信的廣播接收者
public class SMS extends BroadcastReceiver{

@Override
public void onReceive(Context context, Intent intent) {
    Object[] object=(Object[]) intent.getExtras().get("pdus");
    for (Object obj : object) {
        //創(chuàng)建短信的消息對象
        SmsMessage message=SmsMessage.createFromPdu((byte[]) obj);
        //獲取短信的發(fā)送  者
        String from=message.getOriginatingAddress();
        //獲取消息的內(nèi)容
        String msgBody = message.getMessageBody();
    Log.e("TAG", "from:"+from+"msgBody:"+msgBody);
    //獲取驗證碼
    //判斷from是不是自己發(fā)的‘
    if ("122".equals(from)) {
        //通知界面,把短信內(nèi)容添加到EditText
        Intent data = new Intent();
        data.setAction("com.krr.getcode");
        data.putExtra("code", msgBody);
        context.sendBroadcast(data);//發(fā)送廣播
        
    } else {

    }
    }

}

}

···
在清單文件里注冊---------->
···
<receiver android:name=".SMS">
<intent-filter >
<action android:name="android.provider.Telephony.SMS_RECEIVED"/>

        </intent-filter>
    </receiver>

···
接收短信的權(quán)限 :
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
*******效果圖************


image.png

總結(jié)一下:
1版姑、 IP撥號器

  1. 寫一個類繼承BroadcastReceiver柱搜,重寫onReceive方法

  2. 清單文件中注冊receiver節(jié)點,通過intent-filter指定當前廣播接收者要處理的廣播事件

2剥险、 SD卡狀態(tài)監(jiān)聽

  1. 需要監(jiān)聽掛載和卸載的action

  2. SD卡狀態(tài)變化的廣播還需要加一個data聪蘸,scheme是file,否則收不到廣播

  3. 同一個廣播接收者接收了多個廣播事件表制,可以通過action來區(qū)分

3健爬、 短信監(jiān)聽

1.需要監(jiān)聽的action:

<action android:name="android.provider.Telephony.SMS_RECEIVED"/>

廣播接收者按例:
1.卸載安裝
2.開機啟動

***應(yīng)用安裝卸載的廣播************
創(chuàng)建一個類
···
//應(yīng)用安裝卸載的廣播接收器
public class AppInstall extends BroadcastReceiver{

@Override
public void onReceive(Context context, Intent intent) {

String action = intent.getAction();
//獲取應(yīng)用的包名
Uri data=intent.getData();

if ("android.intent.action.PACKAGE_ADDED".equals(action)) {
Log.e("TAG", "install----->" +data);
} else if("android.intent.action.PACKAGE_REMOVED".equals(action)) {
Log.e("TAG", "removed---->" +data);
}
}

}

···
清單文件注冊:
···
<receiver android:name=".AppInstall">
<intent-filter >
<action android:name="android.intent.action.PACKAGE_ADDED"/>
<action android:name="android.intent.action.PACKAGE_REMOVED"/>
<data android:scheme="package"/>
</intent-filter>
</receiver>
···
************開機*********

···
//開機啟動的廣播接收者
public class BootReceiver extends BroadcastReceiver{

@Override
public void onReceive(Context context, Intent intent) {
         Log.e("TAG", "機器開機了")  ;   
         Intent intent2 = new Intent(context,MainActivity.class);
         //指定任務(wù)棧   現(xiàn)在是在廣播接收者中創(chuàng)建一個Activity
         //當前應(yīng)用沒有任何Activity運行  所以不在一個任務(wù)棧
         //需要通過指定一個Flags 在創(chuàng)建Activity的同時創(chuàng)建任務(wù)棧
         intent2.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
         
         context.startActivity(intent2);
         
         
}

}

···
在****MainActivity**************
···
public class MainActivity extends Activity {
EditText et_code;
BroadcastReceiver receiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et_code=(EditText) findViewById(R.id.et_code);

     receiver=new CodeRecerive();
     
    IntentFilter filter=new IntentFilter();
    filter.addAction("com.krr.getcode");
    registerReceiver(receiver, filter);
}
//屏蔽返回鍵
@Override
public void onBackPressed() {
    
}
private class CodeRecerive extends BroadcastReceiver{

    @Override
    public void onReceive(Context context, Intent intent) {
        String code=intent.getStringExtra("code");
        et_code.setText(code);
        
    }
    
}
@Override
    protected void onDestroy() {
    unregisterReceiver(receiver);
    }

}

···

同樣在清單文件里注冊:
···
<receiver android:name=".BootReceiver">
<intent-filter >
<action android:name="android.intent.action.BOOT_COMPLETED"/>

        </intent-filter>
    </receiver>

···
接收開機廣播的權(quán)限
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>

開機廣播不是點擊圖標打開Activtiy
這時不會創(chuàng)建任務(wù)棧 需要我們自己創(chuàng)建任務(wù)棧
Intent i =new Intent ();
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

屏蔽返回鍵 在Activity中
重寫onBackPressed()方法:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末么介,一起剝皮案震驚了整個濱河市娜遵,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌壤短,老刑警劉巖设拟,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異久脯,居然都是意外死亡纳胧,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進店門帘撰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來躲雅,“玉大人,你說我怎么就攤上這事骡和∠嗔蓿” “怎么了?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵慰于,是天一觀的道長钮科。 經(jīng)常有香客問我,道長婆赠,這世上最難降的妖魔是什么绵脯? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮休里,結(jié)果婚禮上蛆挫,老公的妹妹穿的比我還像新娘。我一直安慰自己妙黍,他們只是感情好悴侵,可當我...
    茶點故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著拭嫁,像睡著了一般可免。 火紅的嫁衣襯著肌膚如雪抓于。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天浇借,我揣著相機與錄音捉撮,去河邊找鬼。 笑死妇垢,一個胖子當著我的面吹牛巾遭,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播闯估,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼灼舍,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了睬愤?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤纹安,失蹤者是張志新(化名)和其女友劉穎尤辱,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體厢岂,經(jīng)...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡光督,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了塔粒。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片结借。...
    茶點故事閱讀 39,953評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖卒茬,靈堂內(nèi)的尸體忽然破棺而出船老,到底是詐尸還是另有隱情,我是刑警寧澤圃酵,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布柳畔,位于F島的核電站,受9級特大地震影響郭赐,放射性物質(zhì)發(fā)生泄漏薪韩。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一捌锭、第九天 我趴在偏房一處隱蔽的房頂上張望俘陷。 院中可真熱鬧,春花似錦观谦、人聲如沸拉盾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽盾剩。三九已至雷激,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間告私,已是汗流浹背屎暇。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留驻粟,地道東北人根悼。 一個月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像蜀撑,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子矿卑,可洞房花燭夜當晚...
    茶點故事閱讀 44,901評論 2 355

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