`

Service使用

 
阅读更多

 

1 Service了解 

   主要作用处理一些好事的逻辑,或者执行某些需要长期运行的任务,必要的时候程序退出则Service可以在后台继续保持运行状态

2 Service生命周期  onCreate ,onStartCommand ,onStart ,  onDestroy 

   Service开启的时候依次执行  onCreate ,onStartCommand ,onStart  

   Service 调用stopService 时候执行 onDestroy 

   bindService方法执行Service中的onBind 方法

   unbindService 方法执行Service中的onUnbind 方法

3 Service与线程使用与区别

   1 )Service可以脱离Activity独立运行,2)可以运行在后台 3)与主线程是一个线程 

   有一些东西执行比较耗时,比如下载,但是我下载同时还要做其他事情,这时候使用Service虽然Activity退出了,但是程序依然运行,因为主线程与Service在

一个线程中,会阻碍主线程,这时候可以在Service中启动一个单独的子线程即可 

   总结:当一个任务需要独立Activity运行,这时候用Service    ,Service比较耗时就可以单独启动Thread来使用

4 Service可以是前台Service,也可以做成后台不可见的Service 

 5 使用 

   1)类继承Service 2)在主的xml中进行注册  3)Activity开启与使用 

代码: 

   1 Activity 

   

public class ServiceMainActivity extends Activity  {
 	//为日志工具设置标签  
	private static String TAG = "MusicService";  


	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_service_main);
		
		Log.d("ServiceMainActivity", "ServiceMainActivity thread id is " + Thread.currentThread().getId());  
		
        //输出Toast消息和日志记录  
        Toast.makeText(this, "ServiceMainActivity",  
                Toast.LENGTH_SHORT).show();  
        Log.e(TAG, "ServiceMainActivity");  
          
        initlizeViews();  
        
	}

    
    private void initlizeViews(){  
        Button btnStart = (Button)findViewById(R.id.startMusic);  
        Button btnStop = (Button)findViewById(R.id.stopMusic);  
        Button btnBind = (Button)findViewById(R.id.bindMusic);  
        Button btnUnbind = (Button)findViewById(R.id.unbindMusic);  
          
        //定义点击监听器  
        OnClickListener ocl = new OnClickListener() {  
              
            @Override  
            public void onClick(View v) {
                //显示指定  intent所指的对象是个   service  
                Intent intent = new Intent( ServiceMainActivity.this ,MusicService.class);  
	            switch(v.getId()){  
	                case R.id.startMusic:  
	                    //开始服务  
	                    startService(intent);  
	                    break;  
	                case R.id.stopMusic:  
	                    //停止服务  
	                    stopService(intent);  
	                    break;  
	                case R.id.bindMusic:  
	                    //绑定服务  
	                    bindService(intent, conn, Context.BIND_AUTO_CREATE);  
	                    break;  
	                case R.id.unbindMusic:  
	                    //解绑服务  
	                    unbindService(conn);  
	                    break;  
	              }  
            }  
        };  
          
         //绑定点击监听  
        btnStart.setOnClickListener(ocl);  
        btnStop.setOnClickListener(ocl);  
        btnBind.setOnClickListener(ocl);  
        btnUnbind.setOnClickListener(ocl);  
    }  
      
    //定义服务链接对象  
    final ServiceConnection conn = new ServiceConnection() {  
          
        @Override  
        public void onServiceDisconnected(ComponentName name) {
            Toast.makeText(ServiceMainActivity.this, "ServiceMainActivity onSeviceDisconnected"  
                    , Toast.LENGTH_SHORT).show();  
            Log.e(TAG, "ServiceMainActivity onSeviceDisconnected");  
        }  
          
        @Override  
        public void onServiceConnected(ComponentName name, IBinder service) {  
            Toast.makeText(ServiceMainActivity.this, "ServiceMainActivity onServiceConnected"  
                    ,Toast.LENGTH_SHORT).show();  
            Log.e(TAG, "ServiceMainActivity onServiceConnected");  
            MusicService.MyBinder bind =   (MusicService.MyBinder)service;
            bind.startDownload();
            
            Log.e(TAG, "bind====" +bind);
        }  
    };
    
}

 2 SERvice 

  

public class MusicService extends Service {
	//为日志工具设置标签
	private static String TAG = "MusicService";
	//定义音乐播放器变量
	private MediaPlayer mPlayer;
	
	public MyBinder myBinder = new MyBinder();
	
	//该服务不存在需要被创建时被调用,不管startService()还是bindService()都会启动时调用该方法
	@Override
	public void onCreate() {
		Toast.makeText(this, "MusicSevice onCreate()"
				, Toast.LENGTH_SHORT).show();
		Log.e(TAG, "MusicSerice onCreate()");
		Log.d("MusicService", "MusicService thread id is " + Thread.currentThread().getId());  
		
		//后台的Service使用 
		mPlayer = MediaPlayer.create(getApplicationContext(),R.raw.ring);
//		设置可以重复播放
		mPlayer.setLooping(true);
		
		//前台的Service使用
		Notification notification = new Notification(R.drawable.ic_launcher,  
	                "有通知到来", System.currentTimeMillis());  
        Intent notificationIntent = new Intent(this, ServiceMainActivity.class);  
        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0,  
                notificationIntent, 0);  
        notification.setLatestEventInfo(this, "这是通知的标题", "这是通知的内容",  
                pendingIntent);  
        startForeground(1, notification); 
	        
		super.onCreate();
	}
	
	@Override
	public void onStart(Intent intent, int startId) {
		Toast.makeText(this, "MusicSevice onStart()"
				, Toast.LENGTH_SHORT).show();
		Log.e(TAG, "MusicSerice onStart()");
		
		mPlayer.start();
		
		super.onStart(intent, startId);
	}

	public int onStartCommand(Intent intent, int flags, int startId) {  
		Log.e(TAG, "MusicSerice onStartCommand()");
	    new Thread(new Runnable() {  
	        @Override  
	        public void run() {  
	            // 开始执行后台任务  
	        }  
	    }).start();  
	    return super.onStartCommand(intent, flags, startId);  
	}  
	
	@Override
	public void onDestroy() {
		Toast.makeText(this, "MusicSevice onDestroy()"
				, Toast.LENGTH_SHORT).show();
		Log.e(TAG, "MusicSerice onDestroy()");
		
		mPlayer.stop();
		 
		super.onDestroy();
	}
	//其他对象通过bindService 方法通知该Service时该方法被调用
	@Override
	public IBinder onBind(Intent intent) {
		Toast.makeText(this, "MusicSevice onBind()"
				, Toast.LENGTH_SHORT).show();
		Log.e(TAG, "MusicSerice onBind()");
		
		mPlayer.start();
		
		return null;
	}
	//其它对象通过unbindService方法通知该Service时该方法被调用
	@Override
	public boolean onUnbind(Intent intent) {
		Toast.makeText(this, "MusicSevice onUnbind()"
				, Toast.LENGTH_SHORT).show();
		Log.e(TAG, "MusicSerice onUnbind()");
		
		mPlayer.stop();
		
		return super.onUnbind(intent);
	}

 
	
	//简历与activity的联系类 
	class MyBinder extends Binder {  
		  
        public void startDownload() { 
            new Thread(new Runnable() {  
                @Override  
                public void run() {  
                    // 执行具体的下载任务  
                }  
            }).start();  
            
            Log.d("TAG", "startDownload() executed");  
            // 执行具体的下载任务  
        }  
  
    }  
	
}

  3 xml布局 

  

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    android:orientation="vertical"  
    android:layout_width="fill_parent"  
    android:layout_height="fill_parent"  
    >  
 <TextView    
       android:layout_width="fill_parent"   
       android:layout_height="wrap_content"   
       android:text="Welcome to Andy's blog!"  
       android:textSize="16sp"/>     
    <TextView    
       android:layout_width="fill_parent"   
       android:layout_height="wrap_content"   
       android:text="音乐播放服务"/>  
    <Button  
       android:id="@+id/startMusic"   
       android:layout_width="wrap_content"  
       android:layout_height="wrap_content"  
       android:text="开启音乐播放服务"/>  
    <Button  
       android:id="@+id/stopMusic"   
       android:layout_width="wrap_content"  
       android:layout_height="wrap_content"  
       android:text="停止音乐播放服务"/>  
   <Button  
      android:id="@+id/bindMusic"   
      android:layout_width="wrap_content"  
      android:layout_height="wrap_content"  
      android:text="绑定音乐播放服务"/>  
   <Button  
      android:id="@+id/unbindMusic"   
      android:layout_width="wrap_content"  
      android:layout_height="wrap_content"  
      android:text="解除 ——绑定音乐播放服务"/>  

</LinearLayout>

 

 

 

分享到:
评论

相关推荐

    Service使用demo(Eclipse)

    本示例"Service使用demo(Eclipse)"将深入讲解如何在Eclipse环境中集成并运用Service,同时结合BroadcastReceiver实现更灵活的应用场景。 首先,我们来详细了解Service的基本概念。Service主要分为两种类型:START...

    Reporting Service 使用方法

    Reporting Service 使用方法 Reporting Service 是 SQL Server 2008 中的一项功能强大且灵活的报表生成工具。它允许开发者快速创建专业的报表,满足业务需求。Reporting Service 提供了一个友好的设计器环境,允许...

    Android Service使用注意事项1

    以下是关于"Android Service使用注意事项1"的详细解释: 1. **注册Service** 在Android系统中,所有的组件(包括Service)都必须在`AndroidManifest.xml`文件中声明注册,以便系统知道它们的存在。没有注册的...

    Service服务的各种使用方式

    在Android开发中,Service是四大组件之一,它用于在后台执行...理解并熟练运用各种Service使用方式,能够帮助开发者实现丰富的后台功能,提升应用体验。通过ServiceDemo项目,初学者可以更直观地学习和实践这些知识点。

    进程内Activity和service使用Binder通信代码备份

    3. Activity绑定Service并使用Binder:在Activity中,我们可以通过bindService()方法绑定到Service,并在onServiceConnected()回调中获取到Binder对象。之后就可以调用Service中定义的方法了。 ```java public ...

    android service使用小demo

    android service使用的小demo 包括startService stopService bindService unbindService 两种开启、关闭service的小demo

    android service使用详解

    本篇文章将深入探讨如何在Android中使用Service。 一、Service的基本概念 Service是Android系统中的一个特殊组件,它可以在后台运行,不与用户界面直接交互。Service可以启动(Start)或绑定(Bind),两种方式各有...

    Android Service使用示例

    本示例将详细介绍如何使用 `Service`,特别是 `Start Service` 和 `Bind Service` 两种启动方式,以及如何实现 `Service` 与 `Activity` 之间的数据交互。 ### 1. Start Service `Start Service` 主要用于启动一个...

    qt-solutions-master 源码和qtservice使用案例

    qt-solutions-master 源码和qtservice使用案例工程,包括qtservice,qtbrowserplugin,qtlockedfile,qtpropertybrowser,qtscriptclassic,qtsingleapplication,qtsoap,qtwinmigrate源码qtservice使用案例工程。...

    Service使用Demo

    本教程将通过"Service使用Demo"来详细介绍Service的基本用法及其应用场景。 1. **Service生命周期** Service的生命周期包括创建(onCreate())、启动(onStartCommand())、绑定(onBind())、停止(onStop())和...

    IOTService_使用说明_202007081

    本文将详细介绍"IOTService"的使用说明,包括其工具安装、串口服务器设备连接、功能特性以及测试指导。IOTService是一个专为物联网(IoT)设计的服务平台,它提供了丰富的功能,如串口服务器设备管理、邮件报警、远程...

    service使用及发送通知

    本教程将深入探讨如何使用`Service`,以及在绑定的`Service`中发送`Notification`。 ### 1. 创建和启动Service 创建一个`Service` 需要继承 `android.app.Service` 类,并重写必要的生命周期方法,如 `onCreate()`...

    同一应用同一进程内部Service使用

    本主题将深入探讨“同一应用同一进程内部Service的使用”,包括Service的基本概念、为何在同一进程中使用、如何创建与启动,以及相关注意事项。 ### Service基础 Service是一种没有用户界面的组件,它可以在后台...

    Android开发-Activity与Service使用Messenger通信代码

    这就是使用Messenger进行Activity和Service通信的基本流程。这种通信方式相对简单,适用于需要频繁、轻量级的消息传递。然而,如果需要传输大量数据或复杂的对象,可能需要考虑其他如AIDL(Android Interface ...

    Linux运维-运维课程MP4频-05容器-72dockerswarm网络存储卷-编排部署service使用卷.mp4

    Linux运维-运维课程MP4频-05容器-72dockerswarm网络存储卷-编排部署service使用卷.mp4

    Linux运维-运维课程MP4频-05容器-71dockerswarm网络存储卷-手动创建service使用卷.mp4

    Linux运维-运维课程MP4频-05容器-71dockerswarm网络存储卷-手动创建service使用卷.mp4

    fontgen-loader, 从SVG图标自动生成 webfont web service使用 !.zip

    fontgen-loader, 从SVG图标自动生成 webfont web service使用 ! fontgen-loader - Bam,轻松 webfonts !你遇到了这个你有 4个图标,从FontAwesome到 19,也许你是eying的另一个图标,希望使用它们?真是一团糟行了...

    辅助服务类:AccessibilityService使用

    依据Android官方文档,考虑到一些用户不能很好地使用Android设备,比如由于视力、身体、年龄方面的限制,造成阅读内容、触控操作、声音信息等方面的获取困难,因此Android提供了Accessibility特性和服务帮助用户更好...

    详解Android Service 使用时的注意事项

    "详解Android Service 使用时的注意事项" Android Service 使用时的注意事项是一个非常重要的 topic,对于 Android 开发者来说,了解 Service 的使用要点和注意事项是非常必要的。下面我们将详细介绍 Android ...

Global site tag (gtag.js) - Google Analytics