前言
這個是老師的考試說明中的例題,因為Word文檔實在是太丑了,所以遷移到簡書上
例題
一、填空題
- 可以利用兩個應(yīng)用清單文件中提供的<manifest>元素的
android:sharedUserId屬性,使這兩個應(yīng)用在同一進程中運行。 - SQLiteOpenHelper 中有兩個抽象方法,可以在這兩個方法中去實現(xiàn)創(chuàng)建、升級數(shù)據(jù)庫的邏輯。這兩個方法分別是
onCreate()和onUpgrade()。 - 定義LinearLayout水平方向布局時至少設(shè)置的三個屬性:
android:layout_height、android:layout_width和android:orientation。 - Android安全模型的優(yōu)勢:
保護組件,保護API,訪問控制策略,訪問限制,唯一簽名 - 菜單資源XML中,使用到三個元素:
<menu>、<item>和<group>。 - Android 提供了三種類型的菜單:
選項菜單、上下文菜單、彈出菜單。
二、語句翻譯
Android provides the Criteria class, which provides the application criteria to select a location provider.
翻譯:
Android提供了Criteria類,它提供了選擇位置提供程序的應(yīng)用程序條件。
Each mobile device has an associated mobile platform. The mobile platform is responsible for determining the functions and features available on the mobile device
翻譯:
每個移動設(shè)備都有一個關(guān)聯(lián)的移動平臺。 移動平臺負(fù)責(zé)確定移動設(shè)備上可用的功能和特性
三、閱讀程序題
<EditText
android:id="@+id/editText1" //(1)
android:text=""
android:gravity="top" //(2)
android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1">
</EditText>
public void playSong(final int position, final int cur_pos) {
try {
mMediaPlayer.reset();
mMediaPlayer.setDataSource(MEDIA_PATH + mSongs.get(position));
mMediaPlayer.prepare(); //(3)
mMediaPlayer.seekTo(cur_pos);
mMediaPlayer.start();
mDuration=position;
mMediaPlayer.setOnCompletionListener(new OnCompletionListener() { //(4)
public void onCompletion(MediaPlayer arg0) {
nextSong();
}
});
} catch (IOException e) {
}
}
答案:
- 指定該EditText控件id為editText1
- 設(shè)置EditText控件里的元素的位置位于該控件的頂部
- 讓創(chuàng)建好的mMediaPlayer對象執(zhí)行播放前的準(zhǔn)備操作
- 設(shè)置mMediaPlayer播放完成的監(jiān)聽操作
四、簡答題
- 簡述Android平臺的分層體系架構(gòu)
android平臺的四層架構(gòu):linux內(nèi)核、庫和android運行時、應(yīng)用程序框架、應(yīng)用程序
- linux內(nèi)核:這一層為Android 設(shè)備的各種硬件提供了底層的驅(qū)動,如顯示驅(qū)動、音頻驅(qū)動、照相機驅(qū)動、藍(lán)牙驅(qū)動、Wi-Fi 驅(qū)動、電源管理等。
- 庫和android運行時:這一層通過一些C/C++庫來為Android 系統(tǒng)提供了主要的特性支持,同樣在這一層還有Android 運行時庫,它主要提供了一些核心庫,能夠允許開發(fā)者使用Java 語言來編寫Android 應(yīng)用。
- 應(yīng)用框架層:這一層主要提供了構(gòu)建應(yīng)用程序時可能用到的各種API。
- 應(yīng)用層:所有安裝在手機上的應(yīng)用程序都是屬于這一層的。
- 簡述Intent對象的組成部分
- Component name即組件名稱,是要處理這個Intent對象的組件名稱。
- Action是指Intent要完成的動作,是一個字符串常量。使用 setAction() 和 getAction()來設(shè)置和讀取Action屬性。
- Data屬性是執(zhí)行動作的URI和MIME類型,不同的動作有不同的數(shù)據(jù)規(guī)格。
- Category是一個字符串,提供了額外的信息,有關(guān)于能夠處理這個Intent對象的組件種類,一般在隱式地啟動activity時需要用到。
- Extras傳遞給Intent的額外數(shù)據(jù),以Bundle的形式定義,就是一些鍵值對。數(shù)據(jù)可以被作為一個Bundle對象被使用,利用 putExtras() 和 getExtras() 方法。
- flags各種類型的Flag。很多是用來指定Android系統(tǒng)如何啟動activity,還有啟動了activity后如何對待它。所有這些都定義在Intent類中。
- 有哪些信息在AndroidManifest.xml文件中?
- manifest:根節(jié)點,描述了package中所有的內(nèi)容。
- uses-permission:請求你的package正常運作所需賦予的安全許可。
- permission: 聲明了安全許可來限制哪些程序能你package中的組件和功能。
- instrumentation:聲明了用來測試此package或其他package指令組件的代碼。
- application:包含package中application級別組件聲明的根節(jié)點。
- activity:Activity是用來與用戶交互的主要工具。
- receiver:IntentReceiver能使的application獲得數(shù)據(jù)的改變或者發(fā)生的操作,即使它當(dāng)前不在運行。
- service:Service是能在后臺運行任意時間的組件。
- provider:ContentProvider是用來管理持久化數(shù)據(jù)并發(fā)布給其他應(yīng)用程序使用的組件。
- 簡述Android中Activity布局的種類及其特點。
- 線性布局的子元素可垂直或者水平排列,但是每一列/行中,只能有一個界面元素。
- 框架布局是只存放一個元素的空白空間,且位置只能是空白空間的左上角,如果有多個子元素,后放置的子元素會遮擋先放置的子元素。
- 表格布局將屏幕劃分網(wǎng)格,把界面元素添加到網(wǎng)格中,支持嵌套,也可添加其他的界面布局
- 相對布局中的界面元素的位置是通過與其他的元素的相對位置確定的,具有靈活性。
- 絕對布局的界面元素的位置是通過坐標(biāo)確定的,他是不推薦使用的一種布局
- 網(wǎng)格布局將用戶界面劃分為網(wǎng)格,界面元素可隨意擺放在這些網(wǎng)格中,界面元素可以占用多個網(wǎng)格的,使界面設(shè)計更為靈活。
- Android平臺的數(shù)據(jù)存儲方式有哪些?
- 使用SharedPreferences存儲數(shù)據(jù);它是Android提供的用來存儲一些簡單配置信息的一種機制,采用了XML格式將數(shù)據(jù)存儲到設(shè)備中。只能在同一個包內(nèi)使用,不能在不同的包之間使用。
- 文件存儲數(shù)據(jù);文件存儲方式是一種較常用的方法,在Android中讀取/寫入文件的方法,與Java中實現(xiàn)I/O的程序是完全一樣的,提供了openFileInput()和openFileOutput()方法來讀取設(shè)備上的文件。
- SQLite數(shù)據(jù)庫存儲數(shù)據(jù);SQLite是Android所帶的一個標(biāo)準(zhǔn)的數(shù)據(jù)庫,它支持SQL語句,它是一個輕量級的嵌入式數(shù)據(jù)庫。
- 使用ContentProvider存儲數(shù)據(jù);主要用于應(yīng)用程序之間進行數(shù)據(jù)交換,從而能夠讓其他的應(yīng)用保存或讀取此Content Provider的各種數(shù)據(jù)類型。
- 網(wǎng)絡(luò)存儲數(shù)據(jù);通過網(wǎng)絡(luò)上提供給我們的存儲空間來上傳(存儲)和下載(獲取)我們存儲在網(wǎng)絡(luò)空間中的數(shù)據(jù)信息。
- 注冊廣播有哪幾種方式,這些方式有何區(qū)別?
共有2種方式,分為靜態(tài)注冊和動態(tài)注冊
- 靜態(tài)注冊是在清單文件中申明,如下:
<receive > android:name=".IncomingSMSReceiver " > <intent-filter> <action android:name="android.provider.Telephony.SMS_RECEIVED") <intent-filter> <receiver>
- 動態(tài)注冊是在代碼種進行注冊,如下:
IntentFilter filter =new IntentFilter("android.provider.Telephony.SMS_RECEIVED"); IncomingSMSReceiver receiver = new IncomgSMSReceiver(); registerReceiver(receiver.filter);兩種注冊的區(qū)別:
第一種不是常駐型廣播,也就是說廣播跟隨程序的生命周期。
第二種是常駐型,也就是說當(dāng)應(yīng)用程序關(guān)閉后,如果有信息廣播來,程序也會被系統(tǒng)調(diào)用自動運行
- 簡述Android數(shù)字簽名
- 所有的應(yīng)用程序都必須有數(shù)字證書,Android系統(tǒng)不會安裝一個沒有數(shù)字證書的應(yīng)用程序
- Android程序包使用的數(shù)字證書可以是自簽名的,不需要一個權(quán)威的數(shù)字證書機構(gòu)簽名認(rèn)證
- 如果要正式發(fā)布一個Android ,必須使用一個合適的私鑰生成的數(shù)字證書來給程序簽名,而不能使用adt插件或者ant工具生成的調(diào)試證書來發(fā)布。
- 數(shù)字證書都是有有效期的,Android只是在應(yīng)用程序安裝的時候才會檢查證書的有效期。如果程序已經(jīng)安裝在系統(tǒng)中,即使證書過期也不會影響程序的正常功能。
- UriMatcher類是怎么使用的
在Content Provider中該類幫助匹配URI
- 首先第一步把你需要匹配Uri路徑全部給注冊,如下所示:
//常量UriMatcher.NO_MATCH表示不匹配任何路徑的返回碼
UriMatcher sMatcher = new UriMatcher(UriMatcher.NO_MATCH);
//匹配content://cn.xxt.provider.personprovider/person路徑,返回匹配碼為1
sMatcher.addURI(“cn.xxt.provider.personprovider”, “person”, 1);
//匹配content://cn.xxt.provider.personprovider/person/230路徑,返回匹配碼為2
sMatcher.addURI(“cn.xxt.provider.personprovider”, “person/#”, 2);//#號為通配符- 注冊完需要匹配的Uri后,就可以使用sMatcher.match(uri)方法對輸入的Uri進行匹配,如果匹配就返回匹配碼,匹配碼是調(diào)用addURI()方法傳入的第三個參數(shù)。假設(shè)匹配content://cn.xxt.provider.personprovider/person路徑,返回的匹配碼為1,一般使用switch語句,對不同的匹配使用不同的操作,示例代碼如下:
switch (sMatcher.match(uri)) {
case 1
break;
case 2
break;
default://不匹配
break;
}
- 請根據(jù)自己的理解敘述下Android中的長度單位sp和dp。
- dp(dip): device independent pixels(設(shè)備獨立像素).一種基于屏幕密度的抽象單位。在每英寸160點的顯示器上,1dp = 1px。
要理解這個概念,首先要理解像素密度dpi,即單位英寸的像素點數(shù)量。假如我的手機屏幕尺寸為1.5英寸x2英寸,分辨率為240x320,那它的像素密度即為160dpi。
Android 系統(tǒng)定義了4種分辨率:低(120dpi)、中(160dpi)、高(240dpi)、超高(320dpi),對應(yīng)的dp到px的轉(zhuǎn)換系數(shù)分別是0.75、1、1.5、2,這個系數(shù)乘dp長度就是像素數(shù)。假如我的手機像素密度是240dpi,現(xiàn)在屏幕上有一個長度為80dp 的圖片,那么顯示的像素長度為80x1.5=120px。假如我另一個手機像素密度是320dpi,那么實際像素長度為160px。這樣,同樣的圖片在不同的手機上顯示的尺寸就幾乎沒什么區(qū)別。- sp 全稱是scaled pixels。這個主要是用于項目中的字體大小。使用sp作為單位,當(dāng)用戶通過手機設(shè)置修改手機字體的時候,sp為單位的字體也會跟著改變。
文字用sp 單位,其他非文字用dp 單位。例如textSize="16sp"、layout_width="60dp";
- Activity事件回調(diào)函數(shù):
- onCreate,完全生命周期開始,初始化 Activity;
- onStart,可視生命周期開始,對用戶界面進行必要的更改;
- onRestoreInstanceState,恢復(fù)onSaveLnstanceState保存的用戶界面信息;
- onResume,活動生命周期開始,保存界面信息;
- onSaveInstanceState,在 onResume后,保存界面信息;
- onRestart,重新進入可視生命周期前,載入界面所需要的更改信息;
- onPause,活動生命周期結(jié)束,保存持久地數(shù)據(jù)或釋放占用的資源;
- onStop,可視生命周期結(jié)束,保存持久地數(shù)據(jù)或釋放占用的資源;
- onDestory,完全生命周期結(jié)束,釋放資源。
五、編程題
- 在Intent之間傳遞數(shù)據(jù)
利用Intent直接傳值
MainActivity.java —— 負(fù)責(zé)傳遞數(shù)據(jù)Intent intent1=new Intent(MainActivity.this,Main2Activity.class); intent1.putExtra("extra","hello"); startActivity(intent1);Main2Activity —— 負(fù)責(zé)接收數(shù)據(jù)
Intent intent = getIntent(); String data = intent.getStringExtra("extra"); Log.d(TAG, "onCreate: " + data);利用Bundle和Intent傳值
MainActivity.java —— 負(fù)責(zé)傳遞數(shù)據(jù)Intent intent1=new Intent(MainActivity.this,Main2Activity.class); intent1.putExtra("extra","hello"); startActivity(intent1);Intent intent2 = new Intent(MainActivity.this, Main2Activity.class); Bundle bundle = new Bundle(); bundle.putString("name", "lyy"); bundle.putInt("age", 18); bundle.putString("address", "China"); intent2.putExtras(bundle); startActivity(intent2);Main2Activity —— 負(fù)責(zé)接收數(shù)據(jù)
Intent intent = getIntent(); Bundle bundle = intent.getExtras(); String nameString = bundle.getString("name"); int age = bundle.getInt("age"); String addressString = bundle.getString("address");
- 廣播接受者的編寫
- 動態(tài)注冊
在代碼中注冊,新建一個類,并讓其繼承BroadcastReceiver類,同時重新其父類中的onReceive()方法即可,這樣當(dāng)有廣播到來的時候,onReceive()方法便會得到執(zhí)行,同時需要主活動中進行廣播的注冊,因為全程是在代碼中運行,靈活性強,便被成為動態(tài)注冊,示例如下:private class NetWorkChangeReceiverextends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // do something...... } }在onCreate()方法中執(zhí)行:
intentFilter = new IntentFilter(); intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE"); netWorkChangeReceiver = new NetWorkChangeReceiver(); registerReceiver(netWorkChangeReceiver, intentFilter);在onDestory()方法中執(zhí)行:
unregisterReceiver(netWorkChangeReceiver);//注銷廣播
- 靜態(tài)注冊
和動態(tài)注冊相同的是,靜態(tài)注冊也需要創(chuàng)建一個類去繼承BroadcastReceiver類并實現(xiàn)其中的onReceive()方法,但是注冊的過程被放到了AndroidManifest.xml文件中了,示例如下:
MyBroadcastReceiver.javapublic class MyBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context, "received in MyBroadcastReceiver", Toast.LENGTH_SHORT).show(); } }AndroidManifest.xml
<receiver android:name=".MyBroadcastReceiver" android:enabled="true" adroid:exported="true"> <intent-filter> <action android:name="com.lyy.broadcast.MY_BROADCAST" /> </intent-filter> </receiver>
- 內(nèi)容提供者的編寫
第一步,新建一個類去繼承ContentProvider,并重寫其6個方法,代碼如下:
public class MyProvider extends ContentProvider {
@Override
public boolean onCreate() {
return false;
}
@Nullable
@Override
public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection, @Nullable String[] selectionArgs, @Nullable String sortOrder) {
return null;
}
@Nullable
@Override
public String getType(@NonNull Uri uri) {
return null;
}
@Nullable
@Override
public Uri insert(@NonNull Uri uri, @Nullable ContentValues values) {
return null;
}
@Override
public int delete(@NonNull Uri uri, @Nullable String selection, @Nullable String[] selectionArgs) {
return 0;
}
@Override
public int update(@NonNull Uri uri, @Nullable ContentValues values, @Nullable String selection, @Nullable String[] selectionArgs) {
return 0;
}
}
第二步,指定內(nèi)容提供者的URI,代碼如下
public class MyProvider extends ContentProvider {
public static final int TABLE1_DIR = 0;
public static final int TABLE1_ITEM = 1;
public static final int TABLE2_DIR = 2;
public static final int TABLE2_ITEM = 3;
private static UriMatcher uriMatcher;
static {
uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
uriMatcher.addURI("com.example.app.provider", "table1", TABLE1_DIR);
uriMatcher.addURI("com.example.app.provider ", "table1/#", TABLE1_ITEM);
uriMatcher.addURI("com.example.app.provider ", "table2", TABLE2_ITEM);
uriMatcher.addURI("com.example.app.provider ", "table2/#", TABLE2_ITEM);
}
..........
}
第三步,實現(xiàn)查詢方法
public class MyProvider extends ContentProvider {
..........
@Nullable
@Override
public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection, @Nullable String[] selectionArgs, @Nullable String sortOrder) {
switch (uriMatcher.match(uri)) {
case TABLE1_DIR:
// 查詢table1表中的所有數(shù)據(jù)
break;
case TABLE1_ITEM:
// 查詢table1表中的單條數(shù)據(jù)
break;
case TABLE2_DIR:
// 查詢table2表中的所有數(shù)據(jù)
break;
case TABLE2_ITEM:
// 查詢table2表中的單條數(shù)據(jù)
break;
default:
break;
}
return null;
}
....
}
第四步,處理對MINE類型數(shù)據(jù)的請求
public class MyProvider extends ContentProvider {
...........
@Nullable
@Override
public String getType(Uri uri) {
switch (uriMatcher.match(uri)) {
case TABLE1_DIR:
return "vnd.android.cursor.dir/vnd.com.example.app.provider. table1 ";
case TABLE1_ITEM:
return "vnd.android.cursor.item/vnd.com.example.app.provider. table1 ";
case TABLE2_DIR:
return "vnd.android.cursor.dir/vnd.com.example.app.provider. table2 ";
case TABLE2_ITEM:
return "vnd.android.cursor.item/vnd.com.example.app.provider. table2 ";
default:
break;
}
return null;
}
................
}
第五步,注冊自定義內(nèi)容提供器
<provider
android:name="com.example.mytest.myProvider"
android:authorities="com.example.mytest.provider" >
</provider>