拓展知識:java
MVC全名是Model View Controller,是模型(model)-視圖(view)-控制器(controller)的縮寫,一種軟件設計典範,用一種業務邏輯、數據、界面 顯示分離的方法組織代碼,將業務邏輯彙集到一個部件裏面,在改進和個性化定製界面及用戶交互的同時,不須要從新編寫業務邏輯。MVC被獨特的發展起來用於 映射傳統的輸入、處理和輸出功能在一個邏輯的圖形化用戶界面的結構中。android
模型-視圖-控制器(MVC)是Xerox PARC在二十世紀八十年代爲編程語言Smalltalk-80發明的一種軟件設計模式,已被普遍使用。後來被推薦爲Oracle旗下Sun公司Java EE平臺的設計模式,而且受到愈來愈多的使用ColdFusion和PHP的開發者的歡迎。模型-視圖-控制器模式是一個有用的工具箱,它有不少好處,但也有一些缺點。git
1 package com.example.fileoperatedemo.service; 2 3 import java.io.BufferedReader; 4 import java.io.BufferedWriter; 5 import java.io.File; 6 import java.io.FileInputStream; 7 import java.io.FileNotFoundException; 8 import java.io.FileOutputStream; 9 import java.io.IOException; 10 import java.io.InputStreamReader; 11 import java.io.OutputStream; 12 import java.io.OutputStreamWriter; 13 14 import com.example.fileoperatedemo.MainActivity; 15 16 import android.content.Context; 17 import android.os.Environment; 18 import android.view.View.OnClickListener; 19 20 public class FileService 21 { 22 private Context context; 23 private String fileName; 24 25 public FileService(Context context2, String fileName) 26 { 27 this.context = (Context) context2; 28 this.fileName = fileName; 29 } 30 31 public boolean save(String content) 32 { 33 BufferedWriter bw = null; 34 boolean isSaveSucceed = false; 35 try 36 { 37 /* 38 * 此處須要用到io留設計模式。裝飾類。* 39 * 1:構建文件輸出流通道:FileOutputStream,其中須要用到context的openFileOutput方法 40 * 2:用OutputStream包裝FileOutputStream,裝換成字符輸出流,使用戶輸入中文時,不出現亂碼。 41 * 3:使用BufferedWriter實現緩衝功能,包裝Writer。 42 **/ 43 FileOutputStream fos = context.openFileOutput(fileName, context.MODE_PRIVATE); 44 OutputStreamWriter writer = new OutputStreamWriter(fos); 45 bw = new BufferedWriter(writer);// 46 bw.write(content); 47 isSaveSucceed = true; 48 49 } catch (FileNotFoundException e) 50 { 51 e.printStackTrace(); 52 } catch (IOException e) 53 { 54 e.printStackTrace(); 55 } finally 56 {//流佔用資源,最後必須進行關閉。 57 if (bw != null) 58 try 59 { 60 bw.close(); 61 } catch (IOException e) 62 { 63 e.printStackTrace(); 64 } 65 } 66 return isSaveSucceed; 67 } 68 69 public String read() 70 { 71 String line; 72 StringBuilder sb = new StringBuilder(); 73 BufferedReader br = null; 74 try 75 { 76 FileInputStream fis = context.openFileInput(fileName); 77 br = new BufferedReader(new InputStreamReader(fis)); 78 while ((line = br.readLine()) != null)//讀入文件的過程是一個循環的過程。 79 { 80 sb.append(line); 81 } 82 83 } catch (FileNotFoundException e) 84 { 85 e.printStackTrace(); 86 } catch (IOException e) 87 { 88 e.printStackTrace(); 89 } finally 90 { 91 if (br != null) 92 { 93 try 94 { 95 br.close(); 96 } catch (IOException e) 97 { 98 // TODO Auto-generated catch block 99 e.printStackTrace(); 100 } 101 } 102 } 103 return sb.toString(); 104 } 105 106 }
在此處須要用到單元測試,是爲了後面在肯定業務層方法沒有問題的狀況下,而後就能夠進行對控制層的編寫。github
爲了進行單元測試,必須在ManiFest.xml下:數據庫
在</activity>後天要添加:<uses-library android:name="android.test.runner"/>編程
在</application>後添加:設計模式
1 <instrumentation 2 android:name="android.test.InstrumentationTestRunner" 3 android:targetPackage="com.example.fileoperatedemo" > 4 </instrumentation>
2:添加須要進行單元測試的測試類,並讓其繼承AndroidTestCase:app
1 package com.example.fileoperatedemo.test; 2 3 import com.example.fileoperatedemo.service.FileService; 4 5 import android.test.AndroidTestCase; 6 7 public class FileServieTest extends AndroidTestCase { 8 public void testSave(){ 9 /* 10 * 普通類中沒有context方法。****/ 11 FileService fileService=new FileService(getContext(), "test.txt"); 12 fileService.save("hello world"); 13 } 14 }
若是單元測試成功,將會顯示以下綠色的進程條。不成功將會顯示紅色的條。:編程語言
另外生成的text.txt在ddms-File Explorer下面的data-data-對應所在包下(在本例中就是com.example.fileoperatedemo)查看。也能夠將txt導入到本地查看。ide
2:MainActivity:(拓展:背景音樂的添加:在res下新建一個文件夾raw,裏面導入你須要的音樂。而後在調用的地方調用便可。直接在MainActivity中添加代碼:
1 private MediaPlayer mMediaPlayer; 2 3 private void playLocalFile() { 4 mMediaPlayer = MediaPlayer.create(this, R.raw.in_call_alarm); 5 //播放工程res目錄下的raw目錄中的音樂文件in_call_alarm 6 try { 7 mMediaPlayer.prepare(); 8 } catch (IllegalStateException e) { 9 10 } catch (IOException e) { 11 12 } 13 14 mMediaPlayer.start(); 15 headsetplay.setEnabled(false); 16 17 mMediaPlayer.setOnCompletionListener(new OnCompletionListener() { 18 public void onCompletion(MediaPlayer mp) { 19 //播完了接着播或者關閉mMediaPlayer 20 }); 21 }
MainActivity.java以下:
package com.example.fileoperatedemo; import android.media.MediaPlayer.OnCompletionListener; import java.io.IOException; import com.example.fileoperatedemo.service.FileService; import android.app.Activity; import android.app.AlertDialog; import android.app.Dialog; import android.content.DialogInterface; import android.media.MediaPlayer; import android.os.Bundle; import android.view.Menu; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; //控制層 public class MainActivity extends Activity {
//此處添加了背景音樂,在程序的運行過程當中播放。 private MediaPlayer mMediaPlayer; private EditText etContent; private Button button; private void playLocalFile() { mMediaPlayer = MediaPlayer.create(this,R.raw.shoulder); try { mMediaPlayer.prepare(); } catch (IllegalStateException e) { } catch (IOException e) { } mMediaPlayer.start(); mMediaPlayer.setOnCompletionListener(new OnCompletionListener() { public void onCompletion(MediaPlayer mp) { }}); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); playLocalFile(); initViews(); button=(Button) findViewById(R.id.btnOk); //定義彈出框 AlertDialog.Builder builder=new AlertDialog.Builder(this); builder.setMessage(R.string.dialog_text).setCancelable(false).setTitle(R.string.dialog_title).setPositiveButton(R.string.dialog_ok, new DialogInterface.OnClickListener(){ public void onClick(DialogInterface dialog,int id){ dialog.dismiss(); } }); final AlertDialog alert=builder.create(); //綁定事件 button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { alert.show(); } }); } private void initViews() { etContent = (EditText) findViewById(R.id.etContent); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } public void save(View view) { // 從V獲取數據 String content = etContent.getText().toString(); // 調用模型層M進行處理 FileService fileService = new FileService(this, "data.txt"); boolean isSavesucceed = fileService.save(content); if (isSavesucceed) { Toast.makeText(this, "恭喜你,保存成功了", Toast.LENGTH_LONG).show(); } } }
另外還加入了一個透明背景。在ManiFest中設置Activity Theme爲Theme,Translucents使Activity透明。
運行界面以下:
3:代碼下載請訪問: