ServiceTest
main.xml
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<Button
android:id="@+id/bt_startService"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text=" Service"
/>
<Button
android:id="@+id/bt_stopService"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text=" Service"
/>
<Button
android:id="@+id/bt_bindService"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text=" Service"
/>
<Button
android:id="@+id/bt_unbindService"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text=" Service"
/>
<Button
android:id="@+id/bt_closeApplication"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text=" "
/>
</LinearLayout>
strings.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="hello">Hello World, ServiceTest!</string>
<string name="app_name">ServiceTest01</string>
<string name="Service_started">Service_started</string>
</resources>
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.hyz"
android:versionCode="1"
android:versionName="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".ServiceTest"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service android:name=".MyService" android:exported="true">
<intent-filter>
<action android:name="com.hyz.PlayService.PLAY_MUSIC" />
<category android:name="android.intent.category.default" />
</intent-filter>
</service>
</application>
</manifest>
package com.hyz;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.Binder;
import android.os.IBinder;
import android.util.Log;
/*
* service , startService(intent);
* bindService(intent, serviceConnection, BIND_AUTO_CREATE);
* : ( menu--> --> —> )
* 。 ,
* Activity 。
*/
public class MyService extends Service {
private MediaPlayer player;
private final String service = "Service";
public static String serviceState = "";// , “”
private NotificationManager _nm;
private MyBinder mBinder = new MyBinder(); // Activity
@Override
public IBinder onBind(Intent arg0) { // Service, ; , 。
// TODO Auto-generated method stub // Service onUnbind(),
Log.e(service, "MyService-->onBind()");
serviceState = "onBind";
return mBinder;
}
@Override
public boolean onUnbind(Intent intent) { // Service, onDestroy()
// TODO Auto-generated method stub // , Service, ,
Log.e(service, "MyService-->onUnbind()"); // 。
serviceState = "onUnbind";
return super.onUnbind(intent);
}
@Override
public void onCreate() { // Service
// TODO Auto-generated method stub
super.onCreate();
Log.e(service, "MyService-->onCreate()");
serviceState = "onCreate";
_nm = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
showNotification();
}
@Override
public void onDestroy()
{ // Service
super.onDestroy();
Log.e(service, "MyService-->onDestroy()");
if(serviceState.equals("onStart"))
player.stop();
serviceState = "onDestroy";
}
@Override
public void onStart(Intent intent, int startId)
{
// Service,
super.onStart(intent, startId);
Log.e(service, "MyService-->onStart()");
serviceState = "onStart";
player = MediaPlayer.create(this, R.raw.gequ);
player.start();
}
/**
* Activity , ServiceConnection.onServiceConnected *
*/
public class MyBinder extends Binder
{
MyService getService()
{
Log.e(service, "MyService-->MyBinder-->getService()");
return MyService.this;
}
}
private void showNotification()
{
Notification notification = new Notification(R.drawable.icon,"service started",System.currentTimeMillis());
PendingIntent contentIntent = PendingIntent.getActivity(this, 0, new Intent(this,ServiceTest.class), 0);
notification.setLatestEventInfo(this, "test service","service started" , contentIntent);
_nm.notify(R.string.Service_started,notification);
}
}
package com.hyz;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
public class ServiceTest extends Activity{
private Button bt_startServiect;
private Button bt_stopServiect;
private Button bt_bindServiect;
private Button bt_unbindServiect;
private Button bt_closeApp;
// Service , Activity Service
private ServiceConnection serviceConnection = new ServiceConnection()
{
@Override
public void onServiceConnected(ComponentName name, IBinder service)
{
Toast.makeText(ServiceTest.this, "The Program is Binding!", Toast.LENGTH_SHORT).show();
Log.e("Service", "ServiceTest-->onServiceConnected(serviceConnection)");
}
@Override
public void onServiceDisconnected(ComponentName name)
{
Log.e("Service", "ServiceTest-->onServiceDisconnected(serviceConnection)");
}
};
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
Log.e("Service", "ServiceTest-->onCreate()");
setContentView(R.layout.main);
InitView();
}
@Override
protected void onDestroy()
{
super.onDestroy();
Log.e("Service", "ServiceTest-->onDestroy()");
Log.e("Activity", "onDestroy");
}
private void InitView() {
Log.e("Service", "ServiceTest-->InitView()");
bt_startServiect = (Button) findViewById(R.id.bt_startService);
bt_stopServiect = (Button) findViewById(R.id.bt_stopService);
bt_bindServiect = (Button) findViewById(R.id.bt_bindService);
bt_unbindServiect = (Button) findViewById(R.id.bt_unbindService);
bt_closeApp = (Button) findViewById(R.id.bt_closeApplication);
bt_startServiect.setOnClickListener(new ClickEvent());
bt_stopServiect.setOnClickListener(new ClickEvent());
bt_bindServiect.setOnClickListener(new ClickEvent());
bt_unbindServiect.setOnClickListener(new ClickEvent());
bt_closeApp.setOnClickListener(new ClickEvent());
}
private class ClickEvent implements OnClickListener
{
@Override
public void onClick(View v)
{
Intent intent = new Intent(ServiceTest.this, MyService.class);
switch(v.getId())
{
case R.id.bt_startService: // Service:OnCreate()->onStart()
Log.e("Service", "ServiceTest-->ClickEvent-->onClick(bt_startService)");
startService(new Intent("com.hyz.PlayService.PLAY_MUSIC"));
Log.e("Service", MyService.serviceState);
break;
case R.id.bt_stopService: // Service:onDestroy()
Log.e("Service", "ServiceTest-->ClickEvent-->onClick(bt_stopService)");
ServiceTest.this.stopService(intent);
Log.e("Service", MyService.serviceState);
break;
case R.id.bt_bindService: // Service:OnCreate()->onBind()
Log.e("Service", "ServiceTest-->ClickEvent-->onClick(bt_bindService)");
ServiceTest.this.bindService(intent, serviceConnection, BIND_AUTO_CREATE);
Log.e("Service", MyService.serviceState);
break;
case R.id.bt_unbindService: // Service:onUnbind()->onDestroy()
Log.e("Service", "ServiceTest-->ClickEvent-->onClick(bt_unbindService)");
if("onBind".equals(MyService.serviceState))
{
// , ,
ServiceTest.this.unbindService(serviceConnection);
}
Log.e("Service", MyService.serviceState);
break;
case R.id.bt_closeApplication://
Log.e("Service", "ServiceTest-->ClickEvent-->onClick(bt_closeApplication)");
ServiceTest.this.finish();
break;
default:
break;
}
}
}
}
1、サービスの :startService(intent);
OnCreate()-->onStart()
2、サービスを じる:stopService(intent);
OnDestroy()
3、バインドサービス:bindService(intent,serviceConnection,BIND_AUTO_CREATE);
OnCreate()-->OnBind()-->onServiceConnected(serviceConnection)
4、サービスを める:unbindService(serviceConnection);
onUnbind()-->onDestroy()
AndroidではActivityはフロントプロセス、Serviceはバックグラウンドプロセスです.Activityにはインタフェースがあり、Serviceにはインタフェースがありません.サービスはいつ いますか? も な は、 を するときに、インタフェースの によって の を したくないということです.では、サービスを えば、この をうまく できます.
サービスのライフサイクルは で、 な は の りです.
に2つの があり、 によって けられます.
1、 をバインドしない:
onCreate() --> onStart --> onDestroy();
2、バインド :
onCreate() --> onBind --> onUnbind --> onDestroy();
もちろん、 の2つの を して することができます. えば、onCreate()-->onStart-->sonBind-->onUnbind-->sonDestroy()です.いくつか したいことがあります.
1、1つのサービスは できますが、バインドする は1 のみバインドできます.
2、OnBindバインディングプログラムを び すと、サービスが されるのは2つだけです.1つ は、それをバインディングしたActivityオブジェクトが することです.2つ はOnUnbindメソッドを び して りを めることです.
3、OnStart を び すサービスについては、 び すActivityが するにつれて しません. に したり、Kiillメソッドを び すのを っているだけです.これもインタフェースが しても が され けることを する です.サービスはActivityで び されますが、Activityは するだけで、サービスの の はActivityのクローズの を けません.
4 OnBindバインディングプログラムの のみ、OnUnbindメソッドを び すことができます.そうしないと、エラーが します.
サービスを するには、startService(intent)の2つの があります.もう1つのbindService(intent,serviceConnection,BIND_AUTO_CREATE);この2つの い:1つ は、( menu--> -->アプリケーション-> のサービス)であなたのサービスを ることができます.2つ は、2つ のバインドサービスがバインドされたActivityと するため、 の では えません.