zoukankan      html  css  js  c++  java
  • service

    1、service是Android四大组件之一

    2、service本质上是后台运行的可执行程序,它没有Activity那样的用户界面。

    3、service通常不与用户交互,不能自己启动,运行在后台。

    4、service主要用于长时间的后台服务,以及周期性的后台监控。

      一、播放媒体时,启动其他Activity,此时程序要在后台继续播放。

      二、检测sd卡上的文件变化。

      三、后台记录手机当前地理信息位置的改变

      四、后台完成大文件下载

    5、service具有更高的进程优先级,五个级别中,位于第三个级别。

    6、service具有全局唯一性。同一时间系统只能存在service一个实例。

    7、service必须在项目清单中注册才能使用。

    8、service分为系统服务和应用服务。

      一:系统服务,Android提供大量的系统service,如媒体播放服务。

      二:应用服务,开发者自定义服务。

    下面介绍下service生命周期:

    创建一个service很简单,我们在页面上建两个按钮:

    当点击启动按钮时,启动一个service,此时控制台显示oncreate();当再次点击启动按钮时,此时控制台显示onstartcommand();当点击停止按钮时,此时控制台显示ondestroy();再点停止就没反应了。再点启动就是oncreate();

    界面和简单就不写了。

    MainActivity:

    package com.example.servicedemo;
    
    import android.os.Bundle;
    import android.app.Activity;
    import android.content.Intent;
    import android.view.Menu;
    import android.view.View;
    import android.view.View.OnClickListener;
    
    public class MainActivity extends Activity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            setListener();
        }
    
        private void setListener() {
            startServiceListener();
            stopServiceListener();
        }
    
        private void stopServiceListener() {
            findViewById(R.id.btnstop).setOnClickListener(new OnClickListener() {
                
                @Override
                public void onClick(View arg0) {
                    Intent intent = new Intent(MainActivity.this,MyService.class);
                    stopService(intent);
                }
            });
        }
    
        private void startServiceListener() {
            findViewById(R.id.btn).setOnClickListener(new OnClickListener() {
                
                @Override
                public void onClick(View arg0) {
                    Intent intent = new Intent(MainActivity.this,MyService.class);
                    startService(intent);
                }
            });
        }
    
    
    
    }

    MyService:

     1 package com.example.servicedemo;
     2 
     3 import android.app.Service;
     4 import android.content.Intent;
     5 import android.os.IBinder;
     6 import android.util.Log;
     7 
     8 public class MyService extends Service{
     9 
    10     @Override
    11     public IBinder onBind(Intent arg0) {
    12         
    13         return null;
    14     }
    15     
    16     @Override
    17     public void onCreate() {
    18         // TODO Auto-generated method stub
    19         super.onCreate();
    20         Log.i("main", "onCreate()");
    21     }
    22 
    23     @Override
    24     public int onStartCommand(Intent intent, int flags, int startId) {
    25         // TODO Auto-generated method stub
    26         Log.i("main", "onStartCommand()");
    27         return super.onStartCommand(intent, flags, startId);
    28     }
    29 
    30     @Override
    31     public void onDestroy() {
    32         // TODO Auto-generated method stub
    33         super.onDestroy();
    34         Log.i("main","onDestroy()");
    35     }
    36 }

    同时,要在清单中注册service:

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.servicedemo"
        android:versionCode="1"
        android:versionName="1.0" >
    
        <uses-sdk
            android:minSdkVersion="8"
            android:targetSdkVersion="18" />
    
        <application
            android:allowBackup="true"
            android:icon="@drawable/ic_launcher"
            android:label="@string/app_name"
            android:theme="@style/AppTheme" >
            <activity
                android:name="com.example.servicedemo.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="com.example.servicedemo.MyService"></service>
        </application>
    
    </manifest>

    上面这个是没有绑定service。下面介绍下绑定service并与之通信。

    当启动service时,是绑定和启动一起,那么在解绑的过程中,也是解绑和停止一起。当启动service是,只是启动,没有绑定,那么在绑定之后再解绑,就只是解绑,没有停止service。

    mainactivity:

    package com.example.servicedemo;
    
    import com.example.servicedemo.MyService.MyBinder;
    
    import android.os.Bundle;
    import android.os.IBinder;
    import android.app.Activity;
    import android.content.ComponentName;
    import android.content.Context;
    import android.content.Intent;
    import android.content.ServiceConnection;
    import android.util.Log;
    import android.view.Menu;
    import android.view.View;
    import android.view.View.OnClickListener;
    
    public class MainActivity extends Activity {
        MyBinder mBinder;
        private ServiceConnection conn = new ServiceConnection() {
            
            @Override
            public void onServiceDisconnected(ComponentName arg0) {
                Log.i("main", "解绑service");
            }
            
            @Override
            public void onServiceConnected(ComponentName arg0, IBinder service) {
                mBinder = (MyBinder)service;
                Log.i("main", "绑定service" +"count="+mBinder.getCount());
                
            }
        };
        
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            setListener();
        }
    
        private void setListener() {
            startServiceListener();
            stopServiceListener();
            bindServcieListener();
            unbindServiceListener();
        }
    
        private void unbindServiceListener() {
            findViewById(R.id.btnunbind).setOnClickListener(new OnClickListener() {
                
                @Override
                public void onClick(View arg0) {
                    unbindService(conn);
                }
            });
        }
        //绑定service
        private void bindServcieListener() {
            findViewById(R.id.btnbind).setOnClickListener(new OnClickListener() {
                
                @Override
                public void onClick(View v) {
                    Intent service = new Intent(MainActivity.this,MyService.class);
                    //service:将访问者mainactivity与服务绑定,指定要启动的service
                    //conn:监听访问者和service之间的连接情况。有数据传递。
                    //flag:是否自动创建service。
                    bindService(service , conn, Context.BIND_AUTO_CREATE);
                    
                }
            });
        }
        
        //停止service
        private void stopServiceListener() {
            findViewById(R.id.btnstop).setOnClickListener(new OnClickListener() {
                
                @Override
                public void onClick(View arg0) {
                    Intent intent = new Intent(MainActivity.this,MyService.class);
                    stopService(intent);
                }
            });
        }
    
        //启动service
        private void startServiceListener() {
            findViewById(R.id.btn).setOnClickListener(new OnClickListener() {
                
                @Override
                public void onClick(View arg0) {
                    Intent intent = new Intent(MainActivity.this,MyService.class);
                    startService(intent);
                }
            });
        }
    
    
    
    }

    myservice:

     1 package com.example.servicedemo;
     2 
     3 import android.app.Service;
     4 import android.content.Intent;
     5 import android.os.Binder;
     6 import android.os.IBinder;
     7 import android.util.Log;
     8 
     9 public class MyService extends Service{
    10     int count = 10;
    11     @Override
    12     public IBinder onBind(Intent arg0) {
    13         MyBinder myBinder = new MyBinder();
    14         return myBinder;
    15     }
    16     
    17     class MyBinder extends Binder{
    18         public int getCount(){
    19             return ++count;
    20         }
    21     }
    22     
    23     @Override
    24     public void onCreate() {
    25         // TODO Auto-generated method stub
    26         super.onCreate();
    27         Log.i("main", "onCreate()");
    28     }
    29 
    30     @Override
    31     public int onStartCommand(Intent intent, int flags, int startId) {
    32         // TODO Auto-generated method stub
    33         Log.i("main", "onStartCommand()");
    34         return super.onStartCommand(intent, flags, startId);
    35     }
    36 
    37     @Override
    38     public void onDestroy() {
    39         // TODO Auto-generated method stub
    40         super.onDestroy();
    41         Log.i("main","onDestroy()");
    42     }
    43     @Override
    44     public boolean onUnbind(Intent intent) {
    45         // TODO Auto-generated method stub
    46         Log.i("main","onUnbind()");
    47 //        return super.onUnbind(intent);
    48         return true;//解除绑定后再绑定,这里要返回true。
    49     }
    50     @Override
    51     public void onRebind(Intent intent) {
    52         Log.i("main","onRebind()");
    53         // TODO Auto-generated method stub
    54         super.onRebind(intent);
    55     }
    56 }
  • 相关阅读:
    Spring Boot 整合Spring Security 和Swagger2 遇到的问题小结
    Android 解决listview中checkBox错位选择
    带checkbox的ListView实现(一)——数据与渲染完全分离的传统实现方式
    ViewPager + Fragment实现滑动标签页
    android中使用PopupWindow实现弹出窗口菜单
    Android TextView背景颜色与背景图片设置
    Android特效 五种Toast详解
    Android 带checkbox的listView 实现多选,全选,反选
    android 截取指定位置字符串
    带checkbox的ListView实现(二)——自定义Checkable控件的实现方法
  • 原文地址:https://www.cnblogs.com/haojiahong/p/4596020.html
Copyright © 2011-2022 走看看