2015-4-3~2015-5-28 第四屆全國大學生軟件設計大賽《解密陌生人》項目總結

1、功能模塊html

  • 新用戶註冊:首先用戶須要自拍一張照片,而後輸入用戶暱稱、性別等信息,確認後完成註冊。
  • 查找陌生人:已註冊用戶進入查找陌生人功能後,用戶經過搖動手機查找距離本身一千米範圍內的陌生人,而後將這些陌生人暱稱做爲標記顯示在地圖上。用戶點擊某個陌生人進入解密遊戲環節。(注:用戶搖動手機後App自動將其位置信息公佈出去,供其餘用戶查找。)
  • 解密遊戲:用戶需完成一個解密遊戲後才能看到該陌生人的照片和性別等信息。而後用戶可將該陌生人加入本身的通信錄,同時系統發送一條推送消息給該陌生人,提示誰將其設爲聯繫人,並同時將該用戶自動加入到其通信錄中。
  • 通信錄:通信錄以列表的方式顯示用戶的聯繫人。用戶能夠在此刪除聯繫人。用戶能夠點擊某個聯繫人進入聊天環節。
  • 與陌生人語音聊天、圖片分享:在聊天環節,用戶可使用「按住說話」功能發送語音,或者使用發送圖片功能實    現圖片分享。

環境:Eclipse 、JDK1.七、ADTjava

  根據模塊來剖析項目中所採用的技術吧linux

  Activity、Service、BroadCastRevicer 、handler、多線程、io流、json(項目中沒有解析xml,運用的是json)、http協議android

  數據存儲:記錄用戶登陸帳號,採用SharePreference,聊天數據存儲,聯繫人運用sqlitec++

  查找陌生人:百度地圖API、除此在圖片處理那塊用到了開源的XUtils、搖一搖運用了傳感器面試

  解密遊戲:一個小遊戲,主要運用了重量級的SurfaceView,剩下的就是算法了算法

  通信錄:主要是sqlite,對數據庫的操做,以及各個Activity之間信息的傳遞sql

  語音聊天、圖片分享:語音聊天那塊沒負責,不清楚,哪天抽時間研究實現以後再補筆記吧數據庫

  除此以外,json

  自定義ListView、自定義GridView(分享圖片,圖片排列的佈局方式)、自定義Fragment、自定義toast、自定義加載動畫、

=====================================================================================================

根據上面的內容,如下爲面試可能碰到的問題(若是有錯誤,歡迎你們指正):

            ===================================Android部分=============================================   

 1.簡述Activity的生命週期(最基本的問題如今比較少問道,可是回答不上來就吹了)

  當Activity啓動的時候,會一次執行onCreate()、onStart()、onResume()方法,此時Activity對用戶來講可見也能夠響應用戶操做。

  當Activity從可見變爲被Dialog遮擋時,會調用onPause()方法,此時Activity對用戶仍然可見,可是沒法獲取焦點。也就不能響應用戶的操做。

  當Activiry從被Dialog遮擋的狀態恢復的時候,會調用onResume()方法,從而恢復能夠響應事件的狀態。

  當Activity從可見狀態變爲被其餘Activity覆蓋或者點擊Home進入後臺的時候,會依次調用onPause()、onStop()方法,若是在此期間,系統內存不足,致使Activity被回收的話,會調用onDestory()方法。

  當Activity從被其餘Activity遮擋或者進入後臺狀態恢復,且沒有被系統回收的狀況下,會調用onRestart()、onStart()、onResume(),恢復到能夠響應用戶操做的狀態。

  當Activity從被其餘Activity遮擋或者進入後臺狀態恢復,被系統回收的狀況下,此時至關於從新打開一個Acitivity,會調用onCreate()、onStart()、onResume()方法。

  在onPause()方法執行後,系統會中止動畫等消耗CPU的操做,同時應該在此時保存數據,由於此時當前Activity的優先級下降,可能被系統回收,應在onResume將數據讀出並保存,幫用戶恢復到以前的狀態。

  在onDestory()執行後,activity就不存在了,能夠用isFinish()來判斷,若是此時有Progress Dialog顯示,則應該在onDestory裏面cancel掉,不然線程結束的時候,調用Dialog的cancel方法會拋異常。

  2.Intent啓動Activity有幾種方式,如何實現? 

  啓動方式有兩種,即隱士啓動和顯示啓動

  ①顯示啓動

1 Intent intent = new Intent(MainActivity.this,SecondActivity.class);
2 StartActivity(intent);

  顯示啓動除了上面的方法之外還存在另外一種

1 Intent intent = new Intent();
2 ComponentName component = new ComponentName(this,SecondActivity.class);
3 intent.setComponent(component);
4 startActivity(intent);

其實兩種啓動方式是一致的,如下是Intent構造函數的代碼

1 public Intent(Context packageContext,Class<?>cls){
2        mComponent = new ComponentName(packageContext,cls)       
3 }

  ②隱式意圖的實現

1 Intent intent = new Intent();
2 intent.setAction("second");
3 startActivity(intent);

Action在清單文件中自行配製,且此處的信息要和清單文件中聲明的徹底相同

3.android系統架構有幾層?哪幾層?

  android系統架構分爲4層,分別爲

  應用程序層   java語言開發     應用程序開發

  應用程序架構層   java   os定製    framework層的開發

  系統運行庫層  c/c++  so庫

  Linux內核層

4.android的四大組件是什麼?其做用是什麼?

  四大組件分別爲Activity、Service、Broadcast Receiver、Content Provider

  Activity:一個Activity一般就是一個單獨的屏幕,它在上面能夠顯示一些控件也能夠監聽並處理用戶的事件作出響應。Activity之間利用Intent進行通訊

  Service服務:沒有用戶界面,一段長生命週期的,能夠用來開發監控類的程序。

  BroadcastReceiver:廣播接收者,可使用它對外部事件進行過濾只對須要進行處理的事件進行接收並響應,沒有用戶界面。一般經過啓動一個activity或Service來響應接收到信息。

  Content Provider內容提供者:主要用於多個應用程序間數據的共享,這些數據能夠存儲在文件系統中或者SQLite數據庫中。

5.廣播如何調用,有什麼方式?區別是什麼?

  程序中發送廣播經過sendBroadcastReceiver()實現

  接收廣播步驟   ①繼承BroadcastReceiver   ②重寫onReceiver()方法

  廣播的註冊有兩種方法

     ①在清單文件中經過<receiver>標籤聲明

    常駐型廣播,當應用程序關閉之後,若是有廣播信息傳來,則廣播接收器一樣能夠接收到

  ②在代碼中動態註冊,代碼以下:

1 IntentFilter filter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");
2 IncomingSMSReceiver receiver = new IncomingSMSReceiver();
3 registerReceiver(receiver,filter);

    很是駐型廣播,廣播跟隨activity的生命週期,須要注意的是,在activity結束前,移除廣播接收器。

6.Android中assets文件夾和raw文件夾的區別?

  共同點:

  二者目錄下的文件在打包後,會原封不動的保存在APK中,不會編譯成二進制。

  不一樣點:

  ①res/raw中的文件會被映射到R.java文件中,訪問的時候直接使用資源ID 即R.raw.fileName;assets文件夾下的資源不會被映射到R.java中,訪問的時候須要AssetManage類。

  ②res/raw不能夠有目錄結構,而assets則能夠有目錄結構,即assets目錄下能夠再建文件夾

  ③讀取文件資源舉例:

  讀取raw下的文件資源,經過如下方式獲取輸入流來進行寫操做

InputStream is = getResourse().openRawResource(R.raw.fileName);

讀取assets下的文件資源,經過如下方式獲取輸入流來進行操做

AssetManager am = null;
am = getAssets();
InputStream is = am.open("fileName");      

7.橫豎屏切換時候Activity的生命週期?

  今生命週期和清單文件中的配置息息相關

  ①不設置Activity的android:ConfigChanges時,切屏會從新調用各個生命週期  ,首先銷燬當前Activity而後從新開始

  ②設置Activity的android:configChanges = "orientation|keyboardHidden|screenSize"時,切屏不會從新調用各個生命週期,只會執行onConfigChanged方法。

8.如何將Activity設置成窗口樣式?

  首先自定義一個Activity,而後作以下指定,android:theme = "@android:style/Theme.Dialog"

9.若是你後臺的activity被系統回收之後怎麼辦?若是後臺的Activity因爲某種緣由被系統回收了,如何在被系統回收以前保存當前的狀態?

  除了在棧頂的activity,其餘的activity都有可能在系統內存不足的時候被系統回收,一個Activity越處於棧底,被系統回收的可能性越大。

1 protected void onSaveInstanceState(Bundle outState){
2        super.onSaveInstanceState(outState);
3        outState.putLong("id",33);      
4 }    
5 
6 public void onCreate(Bundle savedInstanceState){
7        //判斷savedInstanceState是否爲空,若不爲空則取出
8       super.onCreate(savedInstanceState);   
9 }

10.如何退出Activity?如何安全退出已調用多個Activity的Application?

  退出activity直接調用finish()方法

    退出Activity會調用onDestory()方法

  ①拋異常強制退出

  該方法經過拋異常,使程序Force Close,此方法交互不好,須要解決的問題是,在不彈出Force Close的狀況下將程序結束掉

    //安全結束進程

android.os.Process.killProcess(android.os.Process.myPid());

  ②記錄打開的Activity:

每次打開一個Activity,就記錄下來。在須要退出時,關閉沒一個Activity便可

  List<Activity>lists;      在application全集環境裏面

  lists = new ArrayList<Activity>();

  lists.add(this);

  for(Activity activity:lists){

  activity.finish();

}

ondestory   lists.remove(this);

  ③發送特定廣播

  在須要結束應用時,發送一個特定的廣播,每一個Activity收到廣播後,關閉便可

  //給某個Activity註冊接收廣播的意圖

registerReceiver(receiver,filter);

  若是接收到的是關閉activity的廣播,就調用finish()方法,把當前的activity finish()掉

  ④遞歸退出

  在打開新的Activity時使用startActivityForResult,而後本身加標誌,在onActicityResult中處理,遞歸關閉。

11.兩個activity之間如何傳遞數據?

  基本數據類型能夠經過Intent傳遞

    extras.putDouble(key,value);

    intent.putExtra(name,value);

    //經過Intent putExtra方法,基本數據類型都傳遞

    intent.getStringExtra("key","value");

    intent.getBooleanExtra("key","value");

    

    Bundle bundle = new Bundle();

    bundle.putShort(key,value);

    intent.putExtras(bundle);

  

  Application全局裏面存放對象,本身去實現本身的application的這個類,基礎系統的application.每一個Activity均可以取到

 

  讓對象實現implements Serializable接口把對象存放到文件上,讓類實現Serializable接口,而後能夠經過ObjectOutputStream讀取

    

File file = new File("\path.obj");
FileOutputStream fos = new FileOutputStream(file);
ObjectOutputStream oos = new objectOutputStream(fos);

Student stu = new Stident();
oos.writeObject(stu);

//從文件中讀出對象
ObjectInputStream ois = new ObjectInputStream(arg0);
Student stu1 = (Student)ois.redObject();

  網絡

  intent.setData(Uri)

  Uri.fromFile();

12.service是否在main thread中執行,service裏面是否能執行耗時操做?

  默認狀況下,若是沒有指定service所運行的進程,Service和activity是運行在當前app所在的進程的main thread(UI主線程)裏面

  service裏面不能執行耗時的操做(網絡請求,拷貝數據庫,大文件),耗時操做須要在子線程中執行new TAHREAS{}.start();

13.怎麼在啓動一個Activity就是啓動一個Service?

  在activity的onCreate()方法裏面startService();

14.同一個程序,但不一樣的Activity是否能夠放在不一樣的Task任務棧中?

  Singleinstance運行在另外的單獨的任務棧中

  在激活一個新的activity時候,給Intent設置flag,Intent的flag添加FLAG_ACTIVITY_NEW_TASK,此時這個被激活的activity就會在新的task棧中。

1 Intent intent = new Intent(A.this,B.class);
2 intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
3 setActivity(intent);

15.Activity怎麼和Service綁定,怎麼在activity中啓動本身對應的service?

  startService()一旦被建立,和調用者無關

  bindService()方法把service和調用者綁定,若是調用者被銷燬,service也會被銷燬,可使用service裏面的方法,構建一個Intent對象

Intent service = new Intent(this,MyService.class);
//經過bindService的方法啓動一個服務
bindService(intent,new conn,BIND_AUTO_CREATE);

private class conn implements ServiceConnection{
      public void onServiceConnected(ComponentName name,IBinder service)     
        //使用IBinder的對象 去使用service裏面的方法
}

     public void onServiceDisconnected(ComponentName name){
      
}

16.activity與service怎麼交互?

 

17.acticity的啓動模式之間的區別?

  當應用程序運行起來後就會開啓一條線程,線程中會運行一個棧,當activity實例建立後就會放入任務棧中。Activity啓動模式的設置在AndroidManifest.xml文件中,經過配置Activity的屬性android:launchMode=""設置

  activity有四種啓動模式,分別爲standared、SingleTop、SingTask、signleInstance  

     standared:默認的標準模式,即在清單文件中不指定時,爲此啓動方式,該模式的特色是:只要建立一經激活,則會向任務棧中加入新建立的實力,退出activity時則會在任務棧中銷燬該實例。

    SingleTop:若是任務棧元素是要被激活的組件處於任務棧的棧頂,不會建立新的activity放在任務棧,而是會複用棧頂的activity。若是棧頂的元素不是要激活的activity,就會建立新的activity放置到任務棧裏面。

    SingleTask:若是發現任務棧裏面已經有了要啓動的這個Activity,它會清空這個activity所在棧上面的全部activity,而後複用這個已經存在的Activity。

    SingleInstance:首先要開啓一個新的任務棧,把要激活的Activity放置到新的任務棧裏,這個任務棧裏面只有一個實例。

18.Intent傳遞數據時,能夠傳遞那些類型數據?

  1.通常的基本數據類型 Intent.putExtra()   intent.getExtra()

  2.數據的uri,intent.setData()  intent.getData()

19.請介紹下ContentProvider是如何實現數據共享的?

  把本身的數據經過uri的形式共享出去, android 系統下不一樣程序數據默認不能共享訪問  須要實現一個類去繼承ContentProvider

public class PersonContentProvider extends ContentProvider{
      public boolean onCreate(){
                  //........................
          }
      query(Uri,String[],String,String[],String);
      insert(Uri,ContentValues);
      update(Uri,ContentValues,String,String[]);
      delete(Uri,String,String[]);
}

20.android的數據存儲方式有哪些?

  文件   sdcard  <data>                  

  數據庫   sqlite

     SharedPreference   <data>/<data>/shared_preps

  網絡  socket tcp udp  http

21.爲何要使用ContentProvider?它和sql的實現上有什麼差異?

  ContentProvider屏蔽數據的存儲細節,對用戶透明,用戶只須要關心操做數據的uri就能夠了,實現不一樣app之間數據的共享

  sql也有增刪改查的方法    可是contentprovider還能夠去增刪改查本地文件,xml文件的讀取,更改,網絡數據讀取更改

22.AIDL的全稱是什麼?如何工做?

  AIDL全稱是android interface definition language(android定義接口語言)。用來跨進程的訪問方法

  經過這種語言定義接口之後,Eclipse插件會自動生成相應的Java代碼接口代碼

  編寫一個AIDL服務的基本步驟:

  ①在Eclipse工程的package目錄中創建一個擴展名爲aidl的文件,package目錄就是java類所在的目錄,該文件的語法相似於Java代碼,aidl文件中定義的是AIDL服務的接口。這個接口須要在調用AIDL服務的程序中訪問。

  ②若是aidl文件的內容hi正確的,Eclipse插件會自動生成一個Java接口文件(*.java)

  ③實現由aidl文件生成的java接口

  ④在清單文件中配置AIDL服務,由其要注意的是,<action>標籤的android:name屬性值就是客戶端要引用改服務的ID,也就是Intent類構造方法的參數值。

23.請解釋下android程序運行時權限與文件系統權限的區別。

  android程序運行時權限,android程序須要讀取到安全敏感項必須在androidmanifest.xml中聲明相關權限相關權限請求,如撥打電話,網絡訪問,獲取當前地理位置,讀寫聯繫人等,安裝的時候會提示用戶

  文件系統權限是linux權限。如sharedPreference裏面的Context.Mode.private   Context.Mode.world_readable   Context.Mode_world_writeable

24.系統上安裝了多種瀏覽器,可否指定某瀏覽器訪問指定的頁面?

  找到對應的瀏覽器意圖,傳遞uri,激活這個意圖

1 Intent intent = new Intent();
2 intent.setClassName(packageName,className);
3 intent.seturi()

25對android虛擬機的理解,包括內存管理機制,垃圾回收機制

 

26.Framwork工做方式及原理,activity是如何生成一個view的,機制是什麼?

 

27.Android UI中的View如何刷新?

  在主線程中,拿到View調用Invalide()方法,查看畫面板裏面更新imageView的方法

  在子線程中能夠經過postInvalide()方法

  View view;

  view.invalidate()

  view.postInvalidate()

28.簡單描述下android數字簽名。

 

29.什麼是ANR,如何避免它?

  ANR即android not responding,當應用程序有一段時間響應不流暢時,系統會向用戶顯示ANR的提示對話框。用戶能夠選擇等待,或者強制關閉,因ANR的出現會極大的影響用戶體驗,所以程序裏對響應性能的設計很重要,通常狀況下,activity5秒內,broadcast 10秒內

  耗時的操做,在子線程中完成  可使用handler message...AsynTask,intentService

30.android中的動畫有哪幾類?其特色和區別是什麼?

  兩種,一種是Tween動畫,一種是Frame動畫

31.說說MVC模式的原理,它在android中的運用。

  MVC即Model-View-Controller,即把一個應用的輸入、處理、輸出流程按照Model、View、Controller的方式進行分離,這樣一個應用就被分爲三個層--模型層、視圖層、控制層

  android中界面部分採用了該框架,在android中M就是應用程序中二進制的數據,V就是用戶的界面。android中的界面直接採用xml文件保存(也可使用js+html),界面開發很方便。

 

32.ddms和traceviewde區別

33.android開發中怎麼去調試bug

34.service裏面能夠彈吐司嗎?

35.android工程的目錄結構

36.寫10個簡單的linux命令

37.java中的soft reference是什麼?

38.tcp鏈接和udp鏈接的不一樣之處?

39.android中獲取圖片有哪幾種方式?

40.TCP/IP和http協議的區別?

  TCP/IP協議是傳輸層協議,主要解決數據如何在網絡中傳輸,而HTTP是應用層協議,主要解決如何包裝數據。

41.屏幕適配問題

42.android中如何隱藏應用程序標題和通知欄

  若是想同時隱藏標題欄和通知欄的話:

  ①在manifest裏面的activity加

android:theme="@android:style/Theme.NoTitleBar.Fullscreen"

  ②在activity的onCreate方法如下代碼:

requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);

  若是隻是想隱藏標題欄的話:

  ①在manifest裏面的activity加

android:theme="@android:style/Theme.NoTitleBar"

  ② 在activity的onCreate方法寫入一下代碼

requestWindowFeature(Window.FEATURE_NO_TITLE);

43.android系統的優缺點

44.android中圖片怎麼存?具體存在哪裏?

  android中圖片通常存在scard中(或者機身內存中),若是圖片不少,最好建立不一樣的子文件夾,而後再把圖片放置到相應的子文件夾下,好比qq、微信。存儲的時候只存儲相應圖片的路徑,保存在sqlite中,經過圖片路徑,再從sd讀取出便可。

45.你用到過什麼設計模式?具體用在哪裏?怎麼實現的?

  經典的MVC模式,分析上面有

  命令模式:將事件代碼寫到自定義的監聽器內,把監聽器設置給控件,操做控件的時候內部調用監聽器方法,來代替事件處理代碼。

  使用自定義控件時用到,下拉刷新和分頁加載列表。  

46.軟件爲何要分層?

  爲了實現「高內聚,低耦合」。把問題劃分開來各個解決,易於控制,易於擴展,易於分配資源......

47.軟件分層的優缺點?

  ①開發人員能夠只關注整個結構中的某一層;

  ②能夠很容易用新的實現來替換原有層次的實現

  ③能夠下降層與層之間的依賴          

  ④有利於標準化

  ⑤利於各邏輯的複用

歸納來講,分層式設計能夠達至以下目的:分散關注、鬆散耦合、邏輯複用、標準定義

  缺點:

  ①下降了系統的性能,若是不採用分層式結構,不少業務能夠直接訪問數據庫,以此獲取相應的數據,如今必須經過中間層來實現。

  ②有時會致使級聯的修改。這種修改尤爲體如今自上而下的方向。若是在表示層中須要增長一個功能,爲保證其符合分層式結構,可能須要在相應的業務邏輯層和數據訪問層中都增長相應的代碼。

  關於第一個缺點能夠經過系統的緩存機制來減少對性能的影響。第二個缺點能夠經過設計模式進行改善。

================================================JAVA開發===============================================

1.ArrayList,Vector,LinkedList的存儲性能和特性。

2.Collection和Collections的區別。

3.HashMap和Hashtable。

4.sleep()和wait()有什麼區別。

5.Overload和Override的區別。

6.同步和異步有何異同,在什麼狀況下分別使用它們?

7.多線程

 

=============================================項目結構==================================================

 在拿到一個項目作的第一件事,不是直接敲代碼,而是分析需求,如何組織代碼結構,是根據業務邏輯劃分,仍是根據功能模塊劃分等等。

  印象很深的一次是,去比賽的時候,應該是一個出題的考官吧,問咱們有沒有實現消息推送的功能,這在賽題中只是一句話,一筆帶過,可是不少人都沒有作,結果就是扣分。還有一次是,在分配項目的過程當中出現了問題,在提交項目前兩天發現一個功能漏掉了,3我的熬了3天2夜趕出來了(從實驗室出來,路都不會走了......)

  如今談談咱們這個項目的組織結構吧,咱們是根據功能模塊劃分的

  ①Activity          com.usc.decode.activity

  ②Service          com.usc.decode.service

  ③BroadCast       com.usc.decode.receiver

  ④數據庫        com.usc.decode.db.dao

  ⑤對象         com.usc.decode.bean

  ⑥自定義控件      com.usc.decode.view

  ⑦工具類        com.usc.decode.utils

  ⑧業務邏輯       com.usc.decode.engine

項目建立

  最低兼容到2.3,爲何是2.3?別問我,本身去查

  最高到4.4,也別問我爲何,本身去查

整個項目結構

  來張圖吧!  

   

 

 木有徹底畫完,畫不下了(ps:畫得很亂,請勿吐槽)

相關文章
相關標籤/搜索