基礎知識

1、Android應用程序四大組件分別是什麼?各個組件所起到的作用是什麼?
答:Android開發四大組件分別是:活動(Activity):用於表現功能。服務(Service):後臺運行服務,不提供界面呈現。廣播接收器(BroadcastReceiver):用於接收廣播。內容提供商(ContentProvider):支持在多個應用中存儲和讀取數據,相當於數據庫。
1) 一般一個Android 應用是由多個Activity 組成的。這多個Activity 之間可以進行相互跳轉
2) Service 是android 系統中的一種組件,它跟Activity 的級別差不多,但是他不能自己運行,只能後臺運行,並且可以和其他組件進行交互
開啓service有兩種方式:
1. Context.startService():Service會經歷onCreate -> onStart(如果Service還沒有運行,則android先調用onCreate()然後調用onStart();如果Service已經運行,則只調用onStart(),所以一個Service的onStart方法可能會重複調用多次 );stopService的時候直接onDestroy,如果是調用者自己直接退出而沒有調用stopService的話,Service會一直在後臺運行。該Service的調用者再啓動起來後可以通過stopService關閉Service。
2. Context.bindService():Service會經歷onCreate() -> onBind(),onBind將返回給客戶端一個IBind接口實例,IBind允許客戶端回調服務的方法,比如得到Service運行的狀態或其他操作。這個時候把調用者(Context,例如Activity)會和Service綁定在一起,Context退出了,Srevice就會調用onUnbind -> onDestroyed相應退出,所謂綁定在一起就共存亡了 。
3) BroadcastReceiver
在Android 中,Broadcast 是一種廣泛運用的在應用程序之間傳輸信息的機制。而BroadcastReceiver 是對發送出來的Broadcast進行過濾接受並響應的一類組件
4)在Android中,ContentResolver是用來發起Content Provider的定位和訪問的。
2、Android應用的目錄組織結構,每個文件夾及文件的用途?
1.src:存放所有的*.java源程序。

  2.gen:爲ADT插件自動生成的代碼文件保存路徑,裏面的R.java將保        存所有的資源ID。

3.assets:可以存放項目一些較大的資源文件,例如:圖片、音樂、字體等。

4.res:可以存放項目中所有的資源文件,例如:圖片(*.png、*.jpg)、文本等。

5.res/drawable-hdpi:保存高分辨率圖片資源,可以使用Resources.getDrawable(id)可以獲得資源類型。

6.res/drawable-ldpi:保存低分辯率圖片資源,可以使用Resources.getDrawable(id)可以獲得資源類型。

7.res/drawable-mdpi:保存中等分辨率圖片資源,可以使用Resources.getDrawable(id)可以獲得資源類型。

8.res/layout:存放所有的佈局文件,主要是用於排列不同的顯示組件,在Android程序中要讀取此配置。

9.res/values:   存放一些資源文件的信息,用於讀取文本資源,在本文件夾之中有一些約定的文件名稱。

3、Android中如何進行事件處理?事件源是什麼?事件處理類是什麼?註冊事件監聽又是怎麼回事?
點擊事件監聽器的四種寫法
方法一:寫一個內部類,在類中實現點擊事件

1、在父類中調用點擊事件

bt_dail.setOnClickListener(new MyButtonListener());  

2、創建內部類

private class MyButtonListener implements OnClickListener{  
        /** 
         * 當按鈕被點擊的時候調用 
         */  
        @Override  
        public void onClick(View v) {  

            callPhone();  
        }  

    }  

方法二:使用匿名內部類

bt_dail.setOnClickListener(new OnClickListener() {  
            @Override  
            public void onClick(View v) {  
                callPhone();  
            }  
        }) 

方法三:讓activity實現點擊接口
1、實現點擊接口

public class MainActivity extends Activity <span style="color:#ff0000">implements OnClickListener</span>  

2、調用點擊事件方法

bt_dail.setOnClickListener(this);  

3、實現接口方法

@Override  
public void onClick(View v) {  
    switch (v.getId()) {  
    case R.id.bt_dail:  
        callPhone();  
        break;  

    default:  
        break;  
    }  

}  

方法四、在layout XML文件中定義button點擊時所調用的方法
1、指定方法

<Button
        Android:id="@+id/bt_dail"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="dailPhone"
        android:text="撥打此號碼" />

2、定義方法
public void dailPhone(View view){
callPhone();
}
4、Activity創建流程是怎樣的?
1、首先創造一個項目

2、填好項目的相關屬性

3、創建一個Activity類的子類類。Eclipse使用alt+/快捷鍵可以自動完成父類

4、在rec/layout文件夾裏創建佈局xml頁面 new->others->android->android xml file

5、註冊剛纔創建的activity子類到AndroidManifest.xml,運用eclisps可以可視化添加,雙擊AndroidManifest.xml 選擇標籤application->add->activity ,輸入剛纔創建 的類名

到此,一個可以使用的activity即創建完成了,下一步是添加UI元素及實現頁面響應代碼
5、Activity的生命週期是怎樣的?
一個Activity在啓動的時候會執行onCreate()->onStart()->onResume(),在結束(或離開)的時候會執行onPause()->onStop()->onDestroy(),這就是一個Activity的生命週期。
因此我們要在onCreate方法裏把Activity的需要的東西準備好,也就是初始化;在onResume裏對Activity裏的東西做一些調整;在onPause做一些清理和保存工作(保存持久狀態),因爲這是最後的
機會,因爲onPause完成之前Android不會結束託管Activity類的進程,而之後進程可能被結束。總結一下這幾個週期方法的作用:

1 .onCreate():創建Activity調用,用於Activity的初始化,還有個Bundle類型的參數,可以訪問以前存儲的狀態。
2.onStart():Activity在屏幕上對用戶可見時調用
3.onResume():Activity開始和用戶交互的時候調用,這時該Activity是在Activity棧的頂部。
4.onPause():Activity被暫停時調用,也就是你要對你能看到的這Activity說byebye的時候調用,這裏可以做一些清理和保存工作
5.onStop():Activity被停止或者Activity變成不可見時調用
6.onDestroy():Activity被從內存中移除,一般發生在執行finish方法時或者Android回收內存的時候
6、Logcat是幹嗎用的?
Android日誌系統提供了記錄和查看系統調試信息的功能。日誌都是從各種軟件和一些系統的緩衝區中記錄下來的,緩衝區可以通過 logcat 命 令來查看和使用.
7、如何實現界面的跳轉?
1.顯示調用方法
ntent實現頁面之間的跳轉有兩種方式

1、 startActivity(intent)

2、 startActivityForResult(intent,requestCode);

onActivityResult(intrequestCode,int resultCode,Intent data)

setResult(resultCode,data)
2.隱式調用方法(只要action、category、data和要跳轉到的Activity在AndroidManifest.xml中設置的匹配就OK
3.跳轉到另一個Activity後,當返回時能返回數據
在跳轉的Activity端,調用startActivityForResult(intent2, 1),跳轉到下一個Activity,其中第一個參數爲傳入的意圖對象,第二個爲設置的請求碼;
跳轉到第二個Activity後,調用setResult(100, intent)方法可返回上一個Activity,其中第一個參數爲結果碼,第二個爲傳入的意圖對象;
在第一個Activity通過onActivityResult()方法獲得返回的數據。
8、跳轉時如何攜帶數據?

1、在MainActivity中獲得意圖對象Intent(意圖對象需要在其構造函數中寫明上下文,及想要跳轉的界面的Class文件)
2、在MainActivity中通過Intent對象的putExtra方法,以鍵值對的方式存入數據(數據附帶在Intent對象中)
3、在MainActivity中通過調用Activity中的startActivity,讓事件發生時實現跳轉功能

4、在ResultActivity中通過調用上下文的getIntent()方法獲得從MainActivity傳過來的意圖對象(即獲得在MainActivity中創建的Intent對象)
5、在ResultActivity中通過獲得的Intent對象的getStringExtra()(這裏以傳字符串爲例子,所以用getStringExtra,其他視情況而定)獲得以存入鍵爲目標的值
6、數據已從MainActivity傳輸過來,後續對字符串進行操作。

public class MainActivity extends Activity {

    private EditText nameEditText;
private EditText sexEditText;
private EditText ageEditText;

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        findView();
        FristPut();
    }
private void findView() {
nameEditText = (EditText) findViewById(R.id.edit_name);
sexEditText = (EditText) findViewById(R.id.edit_sex);
ageEditText = (EditText) findViewById(R.id.edit_age);
}
private void FristPut() {
Intent intent = new Intent(this,ResultActivity.class);
intent.putExtra("name", nameEditText.getText().toString());
intent.putExtra("sex", sexEditText.getText().toString());
intent.putExtra("age", ageEditText.getText().toString());
this.startActivity(intent);
}
(result代碼)
public class ResultActivity extends Activity {


private TextView nameView;
private TextView sexView;
private TextView ageView;


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_result);

findView();
FirstGet();
}
private void FirstGet() {
Intent intent = this.getIntent();
String name = intent.getStringExtra("name");
String sex = intent.getStringExtra("sex");
String age = intent.getStringExtra("age");
nameView.setText("姓名是:"+name);
sexView.setText("性別是:" + sex);
ageView.setText("年齡是:" + age);
}


除了簡單的傳輸String方法,我們還可以通過Bundle類的包裝來傳輸
1、在MainActivity中主要的步驟跟第一種方法差不多,只是在放入數據的時候需要先new 一個Bundle對象以做打包用
,把需要傳輸的數據通過Bundle對象的PutString方法以鍵值對的方式都放在bundle對象中,然後依舊通過Intent對象
的putExtra方法把Bundle對象傳輸過去目標界面

2、在ResultActivity中,步驟還是一樣,主要是在獲得意圖對象以後(Intent)通過其getBundleExtra()方法獲得傳輸過來的Bundle對象
,獲得Bundle對象後通過其getString方法獲得以存入鍵爲目標的值,然後進行進一步的操作
示例代碼:
(main)


 protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        findView();
        SecondPut();
    }
private void SecondPut() {
Intent intent = new Intent(this,ResultActivity.class);
        Bundle bundle = new Bundle();
        bundle.putString("name", nameEditText.getText().toString());
        bundle.putString("sex", sexEditText.getText().toString());
        bundle.putString("age", ageEditText.getText().toString());
        intent.putExtra("name", bundle);
        this.startActivity(intent);
}


1、第三種方法是傳輸一個對象,在Main中把數據都加載在一個實體類對象中(注意此時的實體類必須要序列化及實現Serializable接口或Parcalable接口),
然後依舊通過putExtra把對象傳到目標界面
2、在Result中步驟相同,獲得對象後通過其get屬性方法獲得數據

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        findView();

        ThirdPut();
    }
private void ThridPut() {
//Person是自創的bean類
Intent intent = new Intent(this,ResultActivity.class);

Person person = new Person();

person.setName(nameEditText.getText().toString());

person.setSex(sexEditText.getText().toString());

person.setAge(ageEditText.getText().toString());



intent.putExtra("name", person);

this.startActivity(intent);
}
(Result)
Intent intent = this.getIntent();
Person person = (Person) intent.getSerializableExtra("name");
nameView.setText("姓名是:"+person.getName());
sexView.setText("性別是:" +person.getSex());
ageView.setText("年齡是:" +person.getAge());


1、第四種方法是通過靜態參數來傳輸,在Main中創建你需要傳輸的數據,把數據都創建爲靜態屬性(這裏需要構造函數讓外部實現,默認會有空白構造),
,然後在目標界面通過實例化Main對象。(點)屬性獲得所需要的數據

1、第五種方法是通過全局對象傳輸對象,自定義一個全局對象類繼承Application,Application就表示應用程序對象
,在這個類裏可定義你要傳遞的任何數據類型,任意個數據。創建後需要在清單中的Application中註冊方可使用
9、LinearLayout的特點是什麼
LinearLayout按照垂直或者水平的順序依次排列子元素,每一個子元素都位於前一個元素之後。如果是垂直排列,那麼將是一個N行單列的結構,每一行只會有一個元素,而不論這個元素的寬度爲多少;如果是水平排列,那麼將是一個單行N列的結構。如果搭建兩行兩列的結構,通常的方式是先垂直排列兩個元素,每一個元素裏再包含一個LinearLayout進行水平排列。
LinearLayout中的子元素屬性android:layout_weight生效,它用於描述該子元素在剩餘空間中佔有的大小比例。加入一行只有一個文本框,那麼它的默認值就爲0,如果一行中有兩個等長的文本框,那麼他們的android:layout_weight值可以是同爲1。如果一行中有兩個不等長的文本框,那麼他們的android:layout_weight值分別爲1和2,那麼第一個文本框將佔據剩餘空間的三分之二,第二個文本框將佔據剩餘空間中的三分之一。android:layout_weight遵循數值越小,重要度越高的原則。
10、RelativeLayout的特點是什麼?
RelativeLayout按照各子元素之間的位置關係完成佈局。在此佈局中的子元素裏與位置相關的屬性將生效。例如android:layout_below, android:layout_above等。子元素就通過這些屬性和各自的ID配合指定位置關係。注意在指定位置關係時,引用的ID必須在引用之前,先被定義,否則將出現異常。
RelativeLayout裏常用的位置屬性如下:
    android:layout_toLeftOf —— 該組件位於引用組件的左方
    android:layout_toRightOf —— 該組件位於引用組件的右方
    android:layout_above —— 該組件位於引用組件的上方
    android:layout_below —— 該組件位於引用組件的下方
   android:layout_alignParentLeft —— 該組件是否對齊父組件的左端
   android:layout_alignParentRight —— 該組件是否齊其父組件的右端
   android:layout_alignParentTop —— 該組件是否對齊父組件的頂部
   android:layout_alignParentBottom —— 該組件是否對齊父組件的底部
   android:layout_centerInParent —— 該組件是否相對於父組件居中
   android:layout_centerHorizontal —— 該組件是否橫向居中
   android:layout_centerVertical —— 該組件是否垂直居中

  RelativeLayout是Android五大布局結構中最靈活的一種佈局結構,比較適合一些複雜界面的佈局。
  11、ViewGroup和View有關係嗎
  Android的UI界面都是由View和ViewGroup及其派生類組合而成的。其中,View是所有UI組件的基類,而ViewGroup是容納這些組件的容器,其本身也是從View派生出來的。
  可見,作爲容器的ViewGroup可以包含作爲葉子節點的View,也可以包含作爲更低層次的子ViewGroup,而子ViewGroup又可以包含下一層的葉子節點的View和ViewGroup。事實上,這種靈活的View層次結構可以形成非常複雜的UI佈局,開發者可據此設計、開發非常精緻的UI界面。
  12、何時使用include包含公共的界面,何時選擇自定義控件?
  在一個項目中我們可能會需要用到相同的佈局設計,如果都寫在一個xml文件中,代碼顯得很冗餘,並且可讀性也很差,所以我們可以把相同佈局的代碼單獨寫成一個模塊,然後用到的時候可以通過 標籤來重用layout代碼。
  13、ListView控件使用及其優化是怎樣的?
  ListView的優化:

(前兩點都是利用ListView的自身優化機制優化【緩存優化】)

1.利用ListView自身的緩存機制,他會緩存條目中的一個條目item,當listview第一屏顯示完成之後,就會出現一個緩存條目,其實就是BaseAdapter裏面的public View getView(int position, View convertView, ViewGroup parent)。

2.減少findViewById()的次數,findViewById是一個相對比較耗性能的操作,因爲這個操作每次都需要到佈局中去查找文件。把item裏面的控件封裝成一個javaBean,當item條目被加載的時候就去找到對應的控件。

3.利用時間去換取時間,比如開機優化,把一些重要的程序先啓動了,啓動完系統之後再啓動其他程序。

4.利用空間去換取時間,把要獲取的數據先加載到內存裏面,再處理數據的時候,直接從內存中獲取。

例如:減少數據庫的頻繁打開和關閉和減少查詢的次數。

import java.util.List;
  5 import android.app.Activity;
  6 import android.os.Bundle;
  7 import android.os.Handler;
  8 import android.os.Message;
  9 import android.util.Log;
 10 import android.view.LayoutInflater;
 11 import android.view.View;
 12 import android.view.ViewGroup;
 13 import android.view.animation.TranslateAnimation;
 14 import android.widget.AdapterView;
 15 import android.widget.AdapterView.OnItemClickListener;
 16 import android.widget.BaseAdapter;
 17 import android.widget.ImageView;
 18 import android.widget.ListView;
 19 import android.widget.RelativeLayout;
 20 import android.widget.TextView;
 21 
 22 import com.android.hzy.mobilesafe.R;
 23 import com.android.hzy.mobilesafe.dao.AppLockDao;
 24 import com.android.hzy.mobilesafe.domain.AppInfo;
 25 import com.android.hzy.mobilesafe.engine.AppInfoService;
 26 
 27 public class AppLockManagerActivity extends Activity {
 28 
 29     protected static final int SUCCESS_GET_APPLICATION = 0;
 30     private ListView lv_applockmanager;
 31     private RelativeLayout rl_loading;
 32     private AppInfoService appInfoService;
 33     private List<AppInfo> appInfos;
 34     
 35     private List<String> appLocks; // 程序鎖應用集合
 36     
 37     private AppLockManagerAdapter mAdapter;
 38     private AppLockDao appLockDao;
 39     private Handler mHandler = new Handler(){
 40 
 41         public void handleMessage(Message msg) {
 42             switch (msg.what) {
 43             case SUCCESS_GET_APPLICATION:
 44                 appLocks = appLockDao.findAll();
 45                 mAdapter = new AppLockManagerAdapter();
 46                 lv_applockmanager.setAdapter(mAdapter);
 47                 rl_loading.setVisibility(View.GONE);
 48                 break;
 49 
 50             default:
 51                 break;
 52             }
 53         }
 54         
 55     };
 56     
 57     @Override
 58     protected void onCreate(Bundle savedInstanceState) {
 59         // TODO Auto-generated method stub
 60         super.onCreate(savedInstanceState);
 61         setContentView(R.layout.app_lock_manager);
 62         
 63         lv_applockmanager = (ListView) findViewById(R.id.lv_applockmanager);
 64         rl_loading = (RelativeLayout) findViewById(R.id.rl_loading);
 65         appInfoService = new AppInfoService(this);
 66         
 67         new Thread() {
 68             public void run() {
 69                 appInfos = appInfoService.getAppInfos();
 70                 Message msg = new Message();
 71                 msg.what = SUCCESS_GET_APPLICATION;
 72                 mHandler.sendMessage(msg);
 73             };
 74         }.start();
 75         
 76         appLockDao = new AppLockDao(this);
 77         
 78         lv_applockmanager.setOnItemClickListener(new MyOnItemClickListener());
 79     }
 80     
 81     /**********listview條目點擊事件*************************/
 82     private final class MyOnItemClickListener implements OnItemClickListener{
 83 
 84         @Override
 85         public void onItemClick(AdapterView<?> parent, View view, int position,
 86                 long id) {
 87             // TODO Auto-generated method stub
 88             // 通過ViewHolder的iv_lock 減少findViewById
 89             ImageView iv_lock = ((ViewHolder)view.getTag()).iv_lock;
 90             AppInfo appInfo = (AppInfo) mAdapter.getItem(position);
 91 //            boolean isLockApp = appLockDao.isLockApp(appInfo.getPackagename()); 減少數據庫的查詢
 92             boolean isLockApp = appLocks.contains(appInfo.getPackagename());
 93             if (isLockApp) {
 94                 // 如果有鎖  就解鎖
 95                 appLockDao.delete(appInfo.getPackagename());
 96                 // 解鎖需要將集合中帶鎖應用的移除
 97                 appLocks.remove(appInfo.getPackagename());
 98                 iv_lock.setImageResource(R.drawable.unlock);
 99             } else {
100                 // 如果沒有鎖  就加鎖
101                 appLockDao.add(appInfo.getPackagename());
102                 // 加鎖需要將有鎖的集合中添加該應用
103                 appLocks.add(appInfo.getPackagename());
104                 iv_lock.setImageResource(R.drawable.lock);
105             }
106             
107             // 設置動畫
108             TranslateAnimation animation = new TranslateAnimation(0, 80, 0, 0);
109             animation.setDuration(300);
110             view.startAnimation(animation);
111         }
112         
113     }
114     
115     /**
116      * 適配器
117      */
118     public final class AppLockManagerAdapter extends BaseAdapter{
119         
120         private LayoutInflater mInflater;
121         
122         public AppLockManagerAdapter() {
123             // TODO Auto-generated constructor stub
124             mInflater = getLayoutInflater();
125         }
126         
127         @Override
128         public int getCount() {
129             // TODO Auto-generated method stub
130             return appInfos.size();
131         }
132 
133         @Override
134         public Object getItem(int position) {
135             // TODO Auto-generated method stub
136             return appInfos.get(position);
137         }
138 
139         @Override
140         public long getItemId(int position) {
141             // TODO Auto-generated method stub
142             return position;
143         }
144 
145         @Override
146         public View getView(int position, View convertView, ViewGroup parent) {
147             // TODO Auto-generated method stub
148             View view = null;
149             ViewHolder holder = null;
150             if (convertView != null) {
151                 view = convertView;
152                 holder = (ViewHolder) view.getTag();
153                 Log.i("i", " convertView != null  緩存不等於空  使用緩存");
154                 
155             } else {
156                 Log.i("i", " convertView == null  緩存等於空");
157                 view = mInflater.inflate(R.layout.app_lock_manager_item, null);
158                 holder = new ViewHolder();
159                 holder.iv_appicon = (ImageView) view.findViewById(R.id.iv_appicon);
160                 holder.tv_appname = (TextView) view.findViewById(R.id.tv_appname);
161                 holder.iv_lock = (ImageView) view.findViewById(R.id.iv_lock);
162                 view.setTag(holder);
163             }
164             AppInfo appInfo = appInfos.get(position);
165             
166             ImageView iv_appicon = holder.iv_appicon;
167             TextView tv_appname = holder.tv_appname;
168             ImageView iv_lock = holder.iv_lock;
169             
170             iv_appicon.setImageDrawable(appInfo.getApp_icon());
171             tv_appname.setText(appInfo.getApp_name());
172             
173 //            boolean isLockApp = appLockDao.isLockApp(appInfo.getPackagename());
174             boolean isLockApp = appLocks.contains(appInfo.getPackagename()); // 此功能優化後  不用每次查詢數據庫 直接將所有有鎖的程序都放入集合中存儲
175             if(isLockApp){
176                 iv_lock.setImageResource(R.drawable.lock);
177             }else{
178                 iv_lock.setImageResource(R.drawable.unlock);
179             }
180             
181             return view;
182         }
183         
184     }
185     
186     static class ViewHolder{
187         ImageView iv_appicon;
188         TextView tv_appname;
189         ImageView iv_lock;
190     }
191 }

14、Adapter起到的作用是什麼?
一般是針對包含多個元素的View,如ListView,GridView,ExpandableListview,的時候我們是給其設置一個Adapter。Adapter是與View之間提供數據的橋樑,也是提供每個Item的視圖橋樑。
15、SharedPreferences存儲方式的特點是什麼?最終生成的文件是什麼格式?
在Android中一共提供了5種數據存儲方式,分別爲:

  (1)Files:通過FileInputStream和FileOutputStream對文件進行操作。

  (2)Shared Preferences:常用來存儲鍵值對形式的數據,對系統配置信息進行保存。

  (3)Content Providers:數據共享,用於應用程序之間數據的訪問。

  (4)SQLite:Android自帶的輕量級關係型數據庫,支持SQL語言,用來存儲大量的數據,並且能夠對數據進行使用、更新、維護等操作。

  (5)Network:通過網絡來存儲和獲取數據。
  
  SharedPreferences是android.content.SharedPreferences包內的一個類,它主要是用來共享程序數據的。
SharedPreferences是以鍵值對(key-value)的方式來存儲數據,它可以存儲booleans, floats, ints, longs, and strings這些基本的數據類型。
獲取SharedPreferences對象的方法有兩種:
getSharedPreferences()
這種方法用於APP中有多個SharedPreferences文件,通過名字來獲取SharedPreferences對象;
getPreferences()
這種方法用於Activity中只有一個SharedPreferences文件時,因爲只有一個,所以就不必提供名字。
實際應用時,第一種方法用的會更多。
向SharedPreferences中寫數據:
通過edit()方法獲取SharedPreferences.Editor對象;
調用putXXX()方法,放值,(XXX爲基本數據類型);
調用commit()方法提交放入的值。
最終是以xml方式來保存
16、數據庫存儲用的是什麼?Cursor是什麼?如果不會SQL語句怎麼辦?
SQLite
Cursor 是每行的集合。使用 moveToFirst() 定位第一行。你必須知道每一列的名稱。你必須知道每一列的數據類型。Cursor 是一個隨機的數據源。所有的數據都是通過下標取得。
18、XML解析技術有哪些?
第一種方式:DOM解析器:
第二種方式:SAX解析器:
第三種方式:PULL解析器:
19、JSON解析又是什麼?
JSON的定義:
一種輕量級的數據交換格式,具有良好的可讀和便於快速編寫的特性。業內主流技術爲其提供了完整的解決方案(有點類似於正則表達式 ,獲得了當今大部分語言的支持),從而可以在不同平臺間進行數據交換。JSON採用兼容性很高的文本格式,同時也具備類似於C語言體系的行爲。

package com.jun.json;    

  import java.io.IOException;    
  import java.io.InputStream;    
  import java.io.UnsupportedEncodingException;    
  import java.net.HttpURLConnection;    
  import java.net.URL;    

  import org.apache.http.HttpResponse;    
  import org.apache.http.HttpStatus;    
  import org.apache.http.client.ClientProtocolException;    
  import org.apache.http.client.HttpClient;    
  import org.apache.http.client.methods.HttpGet;    
  import org.apache.http.impl.client.DefaultHttpClient;    
  import org.apache.http.util.EntityUtils;    
  import org.json.JSONArray;    
  import org.json.JSONException;    
  import org.json.JSONObject;    
  import org.json.JSONTokener;    

  import android.os.Bundle;    
  import android.app.Activity;    
  import android.view.Menu;    
  import android.widget.TextView;    

  public class JsonActivity extends Activity {    


      TextView tvJson=null;    
      @Override    
      public void onCreate(Bundle savedInstanceState) {    
          super.onCreate(savedInstanceState);    
          setContentView(R.layout.activity_json);    

          tvJson=(TextView) findViewById(R.id.showTxt);    


          jsonOper();  


      }    
    private void jsonOper() {  
    // TODO Auto-generated method stub  
      String str=connServerForResult("http://bcs.duapp.com/weimeipicture/tes.txt");    


        parseJsonMulti(str);   
}  
/解析多個數據的Json      
      private void parseJsonMulti(String strResult) {       

            String sb ="";     
          try {      

  //           JSONObject jsonObject=new JSONObject();    
  //           jsonObject.optJSONObject(strResult);    
  //           System.out.println("Jsons parse error 1");      
  //            JSONArray jsonObjs =jsonObject.getJSONArray("messages");      



               JSONTokener jsonParser = new JSONTokener(strResult);    
              JSONObject jsonObject = (JSONObject) jsonParser.nextValue();    
               JSONArray jsonObjs =jsonObject.getJSONArray("messages");      

              for(int i = 0; i < jsonObjs.length() ; i++){       
                  JSONObject jsonObj = ((JSONObject)jsonObjs.opt(i)) ;      

                  System.out.println("Jsons parse error 0"+i);      



                  String msg = jsonObj.getString("msg");       


                sb+= "msg:::"+msg + "\n";  


                  System.out.println(sb);       



              }       
              tvJson.setText(sb);       
          } catch (JSONException e) {       
              System.out.println("Jsons parse error !!!!");       
              e.printStackTrace();       
          }       
      }       

    //獲取json文本    
      private String connServerForResult(String strUrl) {       
          // HttpGet對象       
          HttpGet httpRequest = new HttpGet(strUrl);       
          String strResult = "";       
          try {       
              // HttpClient對象       
              HttpClient httpClient = new DefaultHttpClient();       
              // 獲得HttpResponse對象       
              HttpResponse httpResponse = httpClient.execute(httpRequest);       
              if (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {       
                  // 取得返回的數據       
                  strResult = EntityUtils.toString(httpResponse.getEntity());       
                //  str=new  String(str.getBytes("8859_1"),"GB2312");     
                  //tvJson.setText();      



                  }       
          } catch (ClientProtocolException e) {       
              tvJson.setText("protocol error");       
              e.printStackTrace();       
          } catch (IOException e) {       
              tvJson.setText("IO error");       
              e.printStackTrace();       
          }       

          try {    
              strResult=new  String(strResult.getBytes("8859_1"),"GB2312");    
          } catch (UnsupportedEncodingException e) {    
              // TODO Auto-generated catch block    
              e.printStackTrace();    
          }    

          return strResult;       
      }       

      @Override    
      public boolean onCreateOptionsMenu(Menu menu) {    
          getMenuInflater().inflate(R.menu.activity_json, menu);    
          return true;    
      }    
  }    

20、XML解析和JSON解析各自的優缺點是什麼?
JSON Vs XML
1.JSON和XML的數據可讀性基本相同
2.JSON和XML同樣擁有豐富的解析手段
3.JSON相對於XML來講,數據的體積小
4.JSON與JavaScript的交互更加方便
5.JSON對數據的描述性比XML較差

6.JSON的速度要遠遠快於XML
21、多線程創建的方式有哪些?
1.通過繼承Thread類,並改寫run方法來實現一個線程

public class MyThread extends Thread {  

    //繼承Thread類,並改寫其run方法  

    private final static String TAG = "My Thread ===> ";  

    public void run(){  
        Log.d(TAG, "run");  
        for(int i = 0; i<100; i++)  
        {  
            Log.e(TAG, Thread.currentThread().getName() + "i =  " + i);  
        }  
    }  
}  

啓動線程:

new MyThread().start(); 

2.創建一個Runnable對象

public class MyRunnable implements Runnable{  
    private final static String TAG = "My Runnable ===> ";  

    @Override  
    public void run() {  
        // TODO Auto-generated method stub  
        Log.d(TAG, "run");  
        for(int i = 0; i<1000; i++)  
        {  
            Log.e(TAG, Thread.currentThread().getName() + "i =  " + i);  
        }  
    }  
}  

啓動線程:

// providing a new Thread instance with a Runnable object during its creation.  
        new Thread(new MyRunnable()).start();  

3.通過Handler啓動線程

public class MainActivity extends Activity {  

    private final static String TAG = "UOfly Android Thread ==>";  
    private int count = 0;  
    private Handler mHandler = new Handler();  
    private Runnable mRunnable = new Runnable() {  
        public void run() {  
            Log.e(TAG, Thread.currentThread().getName() + " " + count);  
            count++;  
            setTitle("" + count);  
            // 每3秒執行一次  
            mHandler.postDelayed(mRunnable, 3000);  //給自己發送消息,自運行
        }  
    };  
    /** Called when the activity is first created. */  
    @Override  
    public void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.main);  
        // 通過Handler啓動線程  
        mHandler.post(mRunnable);  //發送消息,啓動線程運行
    }  

      @Override      
         protected void onDestroy() {       
             //將線程銷燬掉       
             mHandler.removeCallbacks(mRunnable);       
             super.onDestroy();       
         }       

}  

22、Handler的作用是什麼?
簡單來說,Handler這個類就是管理某個線程(也可能是進程)的消息隊列,比如讓Handler處理主線程的消息隊列,這樣就可以將一些耗時任務放到其他線程之中,待任務完成之後就往主線程的消息隊列中添加一個消息,這樣Handler的Callback,即handleMessage就會被調用。但是Handler並不是線程安全的,因此官方文檔中建議將Handler作爲一個靜態內部類。
所以Handler只是處理消息,耗時任務放在其他線程。
23.ActivityNotFoundException
沒有在Manifest.xml裏註冊
PermissionDennied
AndroidManifest.xml中加權限
NullPointerException
空指針異常

以上來源於自己平時的筆記,整理,希望可以用於以後查閱

發佈了37 篇原創文章 · 獲贊 7 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章