屏幕適配:
盡量用相對布局和線性布局
最好不要用相對布局
為了更好地適配我們用九圖 畫圖
列如:480x320 和 320x240
創(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>
···
****************效果圖****************
手機屏幕分類和像素密度的對應(yīng)關(guān)系:
*****點九 自動拉伸圖:*****
**********最終效果圖***********
一乳蛾、廣播接收者概念(****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"/>
*******效果圖************
總結(jié)一下:
1版姑、 IP撥號器
寫一個類繼承BroadcastReceiver柱搜,重寫onReceive方法
清單文件中注冊receiver節(jié)點,通過intent-filter指定當前廣播接收者要處理的廣播事件
2剥险、 SD卡狀態(tài)監(jiān)聽
需要監(jiān)聽掛載和卸載的action
SD卡狀態(tài)變化的廣播還需要加一個data聪蘸,scheme是file,否則收不到廣播
同一個廣播接收者接收了多個廣播事件表制,可以通過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()方法: