1、Serive的启动与停止
//MainActivity.java
package sunny.example.servicestartstop;
import android.support.v7.app.ActionBarActivity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.Button;
import android.view.View.OnClickListener;
import android.view.View;
public class MainActivity extends ActionBarActivity {
private Button startService;
private Button stopService;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
startService = (Button)findViewById(R.id.startService);
stopService = (Button)findViewById(R.id.stopService);
startService.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v){
Intent intentS = new Intent(MainActivity.this,MyService.class);
startService(intentS);
}
});
stopService.setOnClickListener(new OnClickListener(){
public void onClick(View v){
Intent intent = new Intent(MainActivity.this,MyService.class);
stopService(intent);
}
});
}
/* public void onClick(View v){
switch(v.getId()){
case R.id.startService:
Intent intentS = new Intent(this,MyService.class);
startService(intentS);
break;
case R.id.stopService:
Intent intent = new Intent(this,MyService.class);
startService(intent);
break;
default:
break;
}
}*/
}
//MyService.java
package sunny.example.servicestartstop;
import android.app.Service;
import android.os.IBinder;
import android.content.Intent;
import android.util.Log;
import android.widget.TextView;
public class MyService extends Service{
@Override
public IBinder onBind(Intent intent){
return null;
}
@Override
public void onCreate(){
super.onCreate();
//TextView onCreate = (TextView)findViewById(R.id.onCreate); Service中无此方法
Log.d("MyService","onCreate excuted");
}
@Override
public int onStartCommand(Intent intent,int flags,int startId){
Log.d("MyService","onStartCommand excuted");
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy(){
super.onDestroy();
Log.d("MyService","onDestroy excuted");
}
}
<!--activity_main -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
>
<Button
android:id="@+id/startService"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="StartService" />
<Button
android:id="@+id/stopService"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="StopService"/>
<!-- <TextView
android:id="@+id/onCreate"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<TextView
android:id="@+id/onStartCommand"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
<TextView
android:id="@+id/onDestroy"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/> -->
</LinearLayout>
<!--AndroidManifest.xml 注册方法与Activity类似-->
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="sunny.example.servicestartstop"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="17" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
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"></service>
</application>
</manifest>
2、Activity和Service通信
//MainActivity.java
package sunny.example.servicestartstop;
import android.support.v7.app.ActionBarActivity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.widget.Button;
import android.view.View.OnClickListener;
import android.view.View;
public class MainActivity extends ActionBarActivity {
private Button startService;
private Button stopService;
private Button bindService;
private Button unBindService;
/*通过向下转型得到DownloadBinder实例downloadBinder,在Activity中可以调用DownloadBinder的任意public方法*/
private MyService.DownloadBinder downloadBinder;
private ServiceConnection connection = new ServiceConnection(){
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
// TODO Auto-generated method stub
downloadBinder = (MyService.DownloadBinder) service;
downloadBinder.startDownload();
downloadBinder.getProgress();
}
@Override
public void onServiceDisconnected(ComponentName name) {
// TODO Auto-generated method stub
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
startService = (Button)findViewById(R.id.startService);
stopService = (Button)findViewById(R.id.stopService);
unBindService = (Button)findViewById(R.id.unBindService);
bindService = (Button)findViewById(R.id.bindService);
startService.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v){
Intent intentS = new Intent(MainActivity.this,MyService.class);
startService(intentS);
}
});
stopService.setOnClickListener(new OnClickListener(){
public void onClick(View v){
Intent intent = new Intent(MainActivity.this,MyService.class);
stopService(intent);
}
});
bindService.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent bindIntent = new Intent(MainActivity.this,MyService.class);
/*boolean android.content.ContextWrapper.bindService(Intent service, ServiceConnection conn, int flags)
Connect to an application service, creating it if needed.
This defines a dependency between your application and the service.
For example, if this Context is an Activity that is stopped, the
service will not be required to continue running until the Activity
is resumed.
*/
bindService(bindIntent,connection,BIND_AUTO_CREATE);//将MainActivity与MyService绑定
/*BIND_AUTO_CREATE:Flag for bindService: automatically create the service as long as the binding exists.
* 表示Activity和Service进行绑定后自动创建Service,会调用MyService中的onCreate(),不会调用onStartCommand() */
}
});
unBindService.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
/*void android.content.ContextWrapper.unbindService(ServiceConnection conn)*/
unbindService(connection);
}
});
}
/* public void onClick(View v){
switch(v.getId()){
case R.id.startService:
Intent intentS = new Intent(this,MyService.class);
startService(intentS);
break;
case R.id.stopService:
Intent intent = new Intent(this,MyService.class);
startService(intent);
break;
default:
break;
}
}*/
}
//MyService.java
package sunny.example.servicestartstop;
import android.app.Service;
import android.os.Binder;
import android.os.IBinder;
import android.content.Intent;
import android.util.Log;
public class MyService extends Service{
private DownloadBinder mBinder = new DownloadBinder();
class DownloadBinder extends Binder{
public void startDownload(){
/*int android.util.Log.d(String tag, String msg)
Send a DEBUG log message.
Parameters:
tag Used to identify the source of a log message.
It usually identifies the class or activity where the log call occurs.
msg The message you would like logged.*/
Log.d("MyService","startDownload executed");
}
public int getProgress(){
Log.d("MainActivity","getProgress executed");
return 0;
}
}
/*android.os.IBinder
* Do not implement this interface directly, instead extend from Binder. */
@Override
public IBinder onBind(Intent intent){
return mBinder;
}
@Override
public void onCreate(){
super.onCreate();
//TextView onCreate = (TextView)findViewById(R.id.onCreate); Service中无此方法
Log.d("MyService","onCreate excuted");
}
@Override
public int onStartCommand(Intent intent,int flags,int startId){
Log.d("MyService","onStartCommand excuted");
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy(){
super.onDestroy();
Log.d("MyService","onDestroy excuted");
}
}
3、IntentService
与Service不同,IntentService不用调用stopSelf(),它在Service结束后会自动停止。
//MainActivity.java
package sunny.example.serviceintentservice;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Button;
import android.view.View.OnClickListener;
import android.view.View;
import android.content.Intent;
public class MainActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button startIntentService = (Button)findViewById(R.id.startIntentService);
startIntentService.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v){
Intent intentService = new Intent(MainActivity.this,MyIntentService.class);
startService(intentService);
}
});
}
}
//MyIntentService.java
package sunny.example.serviceintentservice;
import android.app.IntentService;
import android.content.Intent;
import android.util.Log;
public class MyIntentService extends IntentService{
//父类的有参构造函数
public MyIntentService(String name) {
super(name);
// TODO Auto-generated constructor stub
}
/*void android.app.IntentService.onHandleIntent(Intent intent)
This method is invoked on the worker thread with a request to process.
Only one Intent is processed at a time, but the processing happens on
a worker thread that runs independently from other application logic.
So, if this code takes a long time, it will hold up other requests to
the same IntentService, but it will not hold up anything else. When all
requests have been handled, the IntentService stops itself, so you should not call stopSelf.
IntentService在运行结束后会自动停止,不用调用stopSelf()*/
@Override
protected void onHandleIntent(Intent intent) {
// TODO Auto-generated method stub
Log.d("MyIntentService","Thread id is"+Thread.currentThread().getId());
}
}