`
秦朝古月
  • 浏览: 227570 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

使用service

阅读更多
服务(Service)是运行在后台的一段代码。它可以运行在它自己的进程,也可以运行在其他应用程序的上下文(context)里面。其他的组件可以绑定到一个服务上面,通过远程过程调用(RPC)来调用这个方法。例如:媒体播放器的服务,当用户退出媒体选择用户界面,仍然希望音乐可以继续播放,这时就是由服务(Service)来保证当用户界面关闭时音乐继续播放的。

使用服务的方法
  • 第一种是通过调用Context.startServece()启动,调用Context.stoptService()结束,startService()可以传递参数给Service。
  • 第二种方式是通过调用Context.bindService()启动,调用Context.unbindService()结束,还可以通过ServiceConnection 访问Service。二者可以混合使用,可以先startServece()再unbindService()。

Service的生命周期
  • startService()后,即使调用startService()的进程结束了,Service 仍然还存在,直到有进程调用stoptService(),或者Service 自己自杀(stopSelf())。
  • bindService()后,Service 就和调用bindService()的进程同生共死,也就是说当调用bindService()的进程死了,那么它bind 的Service 也要跟着被结束,当然期间也可以调用unbindService()让Service 结束。
  • 两种方式混合使用时,比如说你startService()了,我bindService()了,那么只有你stoptService()了而且我也unbindService()了,这个Service 才会被结束。

进程生命周期
  • Android 系统将会尝试保留那些启动了的或者时绑定了的服务进程。
  • 如果该服务正在进程的onCreate(),onStart()或者onDestroy()这些方法中执行时,那么主进程将会成为一个前台进程,以确保此代码不会被停止。
  • 如果服务已经开始,那么它的主进程会就重要性而言低于所有可见的进程但高于不可见的进程,由于只有少数几个进程是用户可见的,所以只要不是内存特别低,该服务不会停止。
  • 如果有多个客户端绑定了同一个服务,只要客户端中的一个对于用户是可见的,即认为该服务可见。


实现一个当用户界面关闭时音乐继续播放的程序,代码如下:
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="peng.test"
      android:versionCode="1"
      android:versionName="1.0">
    ...
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <service android:name=".Music" >
            <intent-filter>
                <action android:name="peng.test.START_AUDIO_SERVICE" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </service>
    </application>
</manifest> 

src/peng/test/Music.java 服务类
package peng.test;

import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.IBinder;
import android.util.Log;

public class Music extends Service {
	private MediaPlayer player;
	@Override
	public IBinder onBind(Intent intent) {
		// TODO Auto-generated method stub
		return null;
	}
	
    public void onStart(Intent intent, int startId) {
        super.onStart(intent, startId);
        player = MediaPlayer.create(this, R.raw.aimo);
        Log.d("DEBUGTAG", "Music Start");
        player.start();
    }
    
    public void onDestroy() {
    	super.onDestroy();
    	Log.d("DEBUGTAG", "Music Stop");
    	player.stop();
	}
}

src/peng/test/MyMusicPlayer.java Activity 类代码
package peng.test;

import android.app.Activity;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MyMusicPlayer extends Activity
							  implements OnClickListener {
	private Button playMusic;
	@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.second);
        playMusic = (Button)findViewById(R.id.btn_play);
        playMusic.setOnClickListener(this);
    }
    @Override
    public void onClick(View v) {
        if (v.getId() == R.id.btn_play) {
       	    startService(new Intent("peng.test.START_AUDIO_SERVICE"));
        }
    }
}
0
1
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics