19 August 2010
最近在寫一些有關檔案的操作,

要把檔案寫到sdcard裡去

至於怎麼寫,這裡就不多說

在寫檔之前,好的programmer一定要注意到防呆!

就是detect sdcard的狀態

是否有被mount上去?

之前都直接寫一個function去取得目前sdcard的狀態,如下
 private static final boolean fnIsSDcard(){
return Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED);
}



但是在我的需求中,這種寫法會有問題,

因為我的檔案較大,在寫的過程中會耗費比較久的時間,

如果在寫檔的過程中,sdcard被unmounted了! 很好,這個process會被killed掉!

因為這是process中有參照到sdcard裡的位置,所以android os會強制kill掉!

所以我就在想...sdcard有沒有event listener啊??

但是沒有,所以我透過Service和BroadcastReceiver去實作

首先先新增一個class,然後要extends Service,如下


public class serviceSDcard extends Service {
@Override
public IBinder onBind(Intent intent) {
return null;
}

@Override
public void onStart(Intent intent, int startId) {
//新增一個IntentFilter
IntentFilter intentFilter = new IntentFilter();
//並且新增兩個action,告知此 service什麼時候的動作才要通知你
intentFilter.addAction(Intent.ACTION_MEDIA_MOUNTED); //如果sdcard被掛載上去時通知
intentFilter.addAction(Intent.ACTION_MEDIA_UNMOUNTED); //如果sdcard被卸載時通知
intentFilter.addDataScheme("file");
intentFilter.addDataAuthority("*", null);
registerReceiver(receiver, intentFilter); //註冊一個BroadcastReceiver
super.onStart(intent, startId);
}
private BroadcastReceiver receiver = new BroadcastReceiver() {

@Override
public void onReceive(Context context, Intent intent) {
try {

if (intent.getAction().equals(Intent.ACTION_MEDIA_UNMOUNTED)){
//sdcard被卸載時的動作

}else{
//sdcard被掛載時的動作
}


} catch (Exception e) {
Log.d("main", e.toString());
}

}
};
}



一個Service就完成了,現在就要把Service啟動!

在主要執行的activity中去startService();,如下


public class main extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Intent intent = new Intent(this,serviceSDcard.class);
startService(intent);
}
}




這樣就完成啦! 記得要在manifest.xml中新增一個service喔!!如下:


<service android:name=".serviceSDcard"></service>























blog comments powered by Disqus