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
空指針異常
以上來源於自己平時的筆記,整理,希望可以用於以後查閱