1)刚学Android不久,发现Android既然已经有了Thread为什么还要服务,网上查了一些资料个人觉得这点是service存在的关键。
Thread 的运行是独立于 Activity 的,也就是说当一个 Activity 被 finish 之后,如果你没有主动停止 Thread 或者 Thread 里的 run 方法没有执行完毕的话,Thread 也会一直执行。因此这里会出现一个问题:当 Activity 被 finish 之后,你不再持有该 Thread 的引用。另一方面,你没有办法在不同的 Activity 中对同一 Thread 进行控制,而不同的Activity 都可以控制同一 Service.
2) 下面实例代码演示的不同的Activity控制同一个Service的开始和关闭
1.在MainActivity的Package层级下新建自定义类,名为MyService1(后台服务名称),使其继承自Service类。具体代码如下
package com.example.androidapp;
import android.app.Service;
import android.content.Intent;
import android.os.Handler;
import android.os.IBinder;
import android.util.Log;
public class MyService1 extends Service{
private static final String TAG = "MyService1";
/*创建Handler对象,作为进程传递postDelayed之用*/
private Handler objHandler=new Handler();
/*为了确认系统服务运行情况*/
private int counter=0;
/*延迟时间为1000ms*/
private int delayMillis=1000;
/*成员变量mTask为Runnable对象,作为Timer只用*/
private Runnable mTask=new Runnable() {
@Override
public void run() {
/*递增counter整数,作为后台服务运行时识别*/
counter++;
/*以Log对象在LogCat理输出log信息,监看服务运行情况*/
Log.i(TAG, "counter:"+counter);
/*再次调用此Runnable对象,以实现每1秒实现一次的定时器操作*/
objHandler.postDelayed(mTask, delayMillis);
}
};
@Override
public void onStart(Intent intent,int startId){
Log.i(TAG, "onStart");
objHandler.post(mTask);
}
@Override
public void onCreate(){
Log.i(TAG, "onCreate");
super.onCreate();
}
@Override
public IBinder onBind(Intent intent){
Log.i(TAG, "onBind");
/*IBinder方法为Service建构必须覆盖的方法*/
return null;
}
@Override
public void onDestroy(){
Log.i(TAG, "onDestroy");
/*当服务结束,删除mTask运行线程*/
objHandler.removeCallbacks(mTask);
super.onDestroy();
}
}
2.修改MainActivity代码如下,完成的功能是开启Service并跳转Activity
package com.example.androidapp;
import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
public class MainActivity extends Activity {
private Button startButton=null;
private Button testButton=null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
startButton=(Button)findViewById(R.id.startButton);
testButton=(Button)findViewById(R.id.testButton);
/*启动系统服务*/
startButton.setOnClickListener(new Button.OnClickListener() {
@Override
public void onClick(View arg0) {
Intent intent=new Intent("com.demo.SERVICE_DEMO");
startService(intent);
}
});
/*跳转Activity*/
testButton.setOnClickListener(new Button.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent();
intent.setClass(MainActivity.this, TestActivity.class);
startActivity(intent);
MainActivity.this.finish();
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
3.创建TestActivity代码如下,完成的功能是关闭MainActivity中开启的Service
package com.example.androidapp;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class TestActivity extends Activity {
private Button endButton=null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
endButton=(Button)findViewById(R.id.endButton);
/*结束系统服务*/
endButton.setOnClickListener(new Button.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent("com.demo.SERVICE_DEMO");
stopService(intent);
}
});
}
}
4.最后在AndroidManifest.xml创建Service给予类的名称具体代码如下。
<service android:name=".MyService1">
<intent-filter>
<action android:name="com.demo.SERVICE_DEMO"/>
<category android:name="android.intent.catagroy.default"/>
</intent-filter>
</service>
完整的AndroidManifest.xml代码如下
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.androidapp"
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="com.example.androidapp.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=".MyService1">
<intent-filter>
<action android:name="com.demo.SERVICE_DEMO"/>
<category android:name="android.intent.catagroy.default"/>
</intent-filter>
</service>
<activity android:name="TestActivity"></activity>
</application>
</manifest>