Service服务
1:服务是什么?它是没有界面的进程。跟activity相比,只是少界面。
2:服务的启动方式。
(1)启动服务和停止服务。
启动服务生命周期:--onCreate---onStartCommand---onStart---onDestory
再次启动服务:onStartCommand ----onStart---onDestory
当activity启动服务后,那么activity跟服务没有关系了。
(2)绑定服务。
生命周期:onCreate----onbind----onunbind---onDestory.
再次绑定不会调用方法。
3.比较启动服务和绑定服务的区别
(1)生命周期的区别。
启动服务---onStartCommand.
绑定服务---onbind---onunbind方法。
(2)服务和activity的关系
启动服务后,启动者跟服务没有关系,会在后台一直运行。activity销毁,服务不会销毁。
绑定服务后,服务跟activity一起销毁,activity销毁,启动的服务也会销毁。
(3)能否调用服务中的方法
启动服务后不能调用服务中的方法。
绑定服务可以调用服务中的方法。
(4)运行状态
启动服务后,会在后台一直运行。
但是绑定服务,看不到服务在运行。
IntentService与Service有什么区别?
IntentService是Service的子类
1)Service如果要处理异步请求(如耗时操作)的话,需要自己启动一个worker thread,如果启动多个worker thread来处理相关事务的话,各线程之间无法很好的控制。而IntentService可以将多个异步请求的Intent放入队列中,封装了一个开启worker thread的onHandleIntent()方法,来依次处理放入队列中的Intent,只有一个worker thread在运行,同一时刻只有一个Intent被处理,当一个Intent处理完了之后才会处理另外一个Intent。
2)Service可以通过startService()或者bindService()方法来启动,而IntentService则是通过startService()方法来启动。
Service适合多线程处理异步请求。而IntentService则适合处理需要排队的请求。
*使用服务下载图片
public class MainActivity extends AppCompatActivity {
private Intent intent;
public static Handler handle = new Handler() ;
public static ImageView imageView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
intent = new Intent(this,MyService.class);
imageView = (ImageView) findViewById(R.id.imageview);
intent.putExtra("key","http://www.baidu.com/img/bdlogo.gif");
}
public void startService(View view){
startService(intent);
}
public void stopService(View view){
stopService(intent);
}
}
public class MyService extends Service {
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
Log.i("service","---onCreate"+Thread.currentThread());
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.i("service","---onStartCommand"+Thread.currentThread());
final String path = intent.getStringExtra("key");
new Thread(new Runnable() {
@Override
public void run() {
try {
URL url = new URL(path);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
int code = connection.getResponseCode();
if(code == 200){
final Bitmap bitmap = BitmapFactory.decodeStream(connection.getInputStream());
MainActivity.handle.post(new Runnable() {
@Override
public void run() {
MainActivity.imageView.setImageBitmap(bitmap);;
}
});
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onStart(Intent intent, int startId) {
super.onStart(intent, startId);
Log.i("service","---onStart"+Thread.currentThread());
}
@Override
public void onDestroy() {
super.onDestroy();
Log.i("onDestroy","---onDestroy"+Thread.currentThread());
}
}
* MainActivity调用Service中的方法(前提是因为Service中的对象不能new出来)
public class MyService extends Service {
class MyBinder extends Binder{
public MyService returnBinder(){
return MyService.this;
}
}
@Override
public IBinder onBind(Intent intent) {
Log.i("Service","onbind");
MyBinder binder = new MyBinder();
return binder;
}
@Override
public boolean onUnbind(Intent intent) {
Log.i("Service","onUnbind");
return super.onUnbind(intent);
}
@Override
public void onCreate() {
super.onCreate();
Log.i("Service","onCreate");
}
@Override
public void onDestroy() {
super.onDestroy();
Log.i("Service","onDestroy");
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return super.onStartCommand(intent, flags, startId);
}
public void play(){
Log.i("Service","开始播放");
}
public void pause(){
Log.i("Service","暂停播放");
}
}
public class MainActivity extends AppCompatActivity {
private Intent intent;
private MyServiceConnection myServiceConnection;
private MyService myService;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
intent = new Intent(this,MyService.class);
myServiceConnection = new MyServiceConnection();
}
public void bind(View v){
bindService(intent,myServiceConnection,BIND_AUTO_CREATE);
}
public void unbind(View v){
unbindService(myServiceConnection);
}
public void play(View v){
myService.play();
}
public void pause(View v){
myService.pause();
}
class MyServiceConnection implements ServiceConnection{
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
MyService.MyBinder binder = (MyService.MyBinder) service;
myService = binder.returnBinder();
Log.i("Service","onServiceConnected");
}
@Override
public void onServiceDisconnected(ComponentName name) {
Log.i("Service","onServiceDisconnected");
}
}
}
技巧:
MyService extends Service
MyBinder extends Binder extends IBinder
MyService - onBind() = IBinder -> MyBinder - returnBinder() = MyService
所以MyService通过onBind()方法得到IBinder,强转MyBinder后通过returnBinder()方法得到自己的对象。前半句是在Service中执行,后半句是在MainActiviy中执行,IBinder是中间人
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!