編輯:關於Android編程
創建服務類:創建MyService類繼承Service,其中內部類IServiceImpl繼承系統的binder類 和實現自定義接口IService
IService提供外部調用的方法:
[java]
package com.example.serverlifecycle;
public interface IService {
public void callMethodInService();
}
系統的binder類實現了IBinder接口.在創建的服務類重寫父類的onBind方法中返回實現了binder類和繼承iservice的類的一個對象.在實現了binder的類中重寫IService接口中的方法,調用在實現了service的類中的方法.這樣就能達到調用綁定服務的方法.可以獲取服務中的數據.只有綁定的服務才能獲取服務數據
service業務類:
[java]
package com.example.serverlifecycle;
import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
/**
* 服務的開啟方法<br>
* 1:開啟方法startService(intent)/stopService(intent)<br>
* 2:綁定服務bindService(intent, conn, Context.BIND_AUTO_CREATE)/unbindService(conn)
* 區別:開啟服務,服務一旦開啟,與調用者沒有任何關系,調用者的activity即使是退出了.也不會影響後台service的運行,
* 在activity裡不能使用服務的方法<br>
* 綁定服務,通過綁定開啟的服務,服務跟調用者不求同生但求同死,如果調用者的activity退出了(或者在當前的activity點擊返回按鈕),
* 那它綁定的服務也回跟著退出,綁定方式開啟的服務,是可以在activity中調用服務的方法<br>
*
* @author Administrator
*
*/
public class MyService extends Service {
@Override
/**
* 綁定時調用的方法,如果服務不存在,就執行onCreate方法創建服務,然後執行onBind方法綁定服務,之後再執行onBind方法就沒效果了
*/
public IBinder onBind(Intent intent) {
// IBinder 繼承了Binder
System.out.println("onBind");
return new IServiceImpl();// 返回自定義的繼承了binfer類(等於也實現了IBinder)和實現了IService類的一個對象
}
/**
* 服務裡面的方法
*/
public void sayHelloInService() {
System.out.println("hello service");
}
/**
* Binder實現了IBinder接口,IServiceImpl有繼承了Binder,等於是IServiceImpl也實現了IBinder方法
* IService 自己定義的接口
*
* @author Administrator
*
*/
public class IServiceImpl extends Binder implements IService {
@Override
public void callMethodInService() {
sayHelloInService();
}
}
@Override
/**
* 解除綁定調用的方法,調用了onUnbind方法後會跟著調用onDestroy方法,解除服務之後結束服務<br>
* 綁定的服務職能解除一次,如果多次解除服務,程序會有異常
*/
public boolean onUnbind(Intent intent) {
// TODO Auto-generated method stub
System.out.println("onUnbind");
return super.onUnbind(intent);
}
@Override
/**
* 只有在第一次啟動服務或者調用了onDestroy之後再中心開啟服務才會調用onCreate
*/
public void onCreate() {
super.onCreate();
System.out.println("onCreate");
}
@Override
/**
* 停止一個服務
*/
public void onDestroy() {
super.onDestroy();
System.out.println("onDestroy");
}
@Override
/**
* 開始一個服務
*/
public void onStart(Intent intent, int startId) {
super.onStart(intent, startId);
System.out.println("onStart");
}
}
在配置文件中的application標簽中注冊上面的服務類
[html]
<service android:name="MyService" />
創建布局文件:
[html]
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<Button
android:id="@+id/start"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="啟動服務" />
<Button
android:id="@+id/end"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="停止服務" />
<Button
android:id="@+id/startBindService"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="綁定服務" />
<Button
android:id="@+id/endBindService"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="解除綁定" />
<Button
android:id="@+id/callMethod"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="調用服務裡的方法" />
</LinearLayout>
界面業務代碼:
[java]
package com.example.serverlifecycle;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class MainActivity extends Activity implements OnClickListener {
private Button startButton;// 普通開啟服務按鈕
private Button endButton;
private Intent intent;
private Button startBindButton;// 綁定服務
private Button endBindButton;// 解除服務
private Button callMethodInService;// 解除服務
private MyServiceConnection conn;
private IService iService;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
startButton = (Button) findViewById(R.id.start);
endButton = (Button) findViewById(R.id.end);
startButton.setOnClickListener(this);
endButton.setOnClickListener(this);
intent = new Intent(this, MyService.class);
startBindButton = (Button) findViewById(R.id.startBindService);
endBindButton = (Button) findViewById(R.id.endBindService);
startBindButton.setOnClickListener(this);
endBindButton.setOnClickListener(this);
callMethodInService = (Button) findViewById(R.id.callMethod);
callMethodInService.setOnClickListener(this);
conn = new MyServiceConnection();
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.start:
startService(intent);// 啟動服務
break;
case R.id.end:
stopService(intent);// 停止服務
break;
case R.id.startBindService:// 綁定服務
bindService(intent, conn, Context.BIND_AUTO_CREATE);// 綁定服務,參數3如果這個綁定的服務不存在的時候,綁定的時候就會創建出這個服務
break;
case R.id.endBindService:
unbindService(conn);// 解除綁定服務
break;
case R.id.callMethod:
iService.callMethodInService();
break;
}
}
@Override
protected void onDestroy() {
unbindService(conn);// 在activity結束的時候,調用unbindService(conn)可避免出現serviceconnectionleaked異常
super.onDestroy();
}
class MyServiceConnection implements ServiceConnection {
@Override
/**
* 綁定某個服務成功後執行的方法,就是在綁定的服務執行了onCreate方法之後
* service,該對象是由綁定服務的onBind方法的返回值,因為onBind()返回值實現IService接口,所以可以強制轉換為IService接口類型
*/
public void onServiceConnected(ComponentName arg0, IBinder service) {
iService = (IService) service;
}
@Override
public void onServiceDisconnected(ComponentName arg0) {
}
}
}
1.下面示例是一個簡單的定位,來自官網,對這些源碼加了一些注釋,這樣看起來可能會更容易理解一點。2.直接上源碼androidManifest.xml
今天我先來寫一下側滑菜單,如圖: 側滑菜單的實現方法有很多,網上也有完整的開源框架,現在如果用Android Studio開發的話,一開始選模板的時候就可以選擇
Android測試支持庫包含 UI自動化模塊 ,它可以對Android應用進行自動黑盒測試。在API Level 18中引入了自動化模塊,它允許開發者在組成應用UI的控件
Toast的自定義使用原理與其類似。1.Toast源碼分析老規矩,我們先去看Toast的源碼。Toast有兩種顯示布局方式,一種最常見調用Toast.makeText()