首页 技术 正文
技术 2022年11月9日
0 收藏 881 点赞 3,561 浏览 7466 个字

http://blog.csdn.net/lizzy115/article/details/7001731

onDestroy()三个方法。
服务不能自己运行,需要通过调用Context.startService()或Context.bindService()方法启动服务。这两个方法都可以启动Service,但是它们的使用场合有所不同。

  1. 使用startService()方法启用服务,调用者与服务之间没有关连,即使调用者退出了,服务仍然运行。    如果打算采用Context.startService()方法启动服务,在服务未被创建时,系统会先调用服务的onCreate()方法,接着调用onStart()方法。如果调用startService()方法前服务已经被创建,多次调用startService()方法并不会导致多次创建服务,但会导致多次调用onStart()方法。 采用startService()方法启动的服务,只能调用Context.stopService()方法结束服务,服务结束时会调用onDestroy()方法。
  2. 使用bindService()方法启用服务,调用者与服务绑定在了一起,调用者一旦退出,服务也就终止,大有“不求同时生,必须同时死”的特点。onBind()只有采用Context.bindService()方法启动服务时才会回调该方法。该方法在调用者与服务绑定时被调用,当调用者与服务已经绑定,多次调用Context.bindService()方法并不会导致该方法被多次调用。采用Context.bindService()方法启动服务时只能调用onUnbind()方法解除调用者与服务解除,服务结束时会调用onDestroy()方法。

【Android开发日记】之入门篇(五)——Android四大组件之Service

四、Service实例

接下来我会写一个关于service的实例demo,希望看了之后会对大家有所帮助。

  1. 先新建一个项目,并新建一个class文件,命名为MinaService,继承于service(不要忘记在AndroidManifest.xml文件里注册),其中代码如下:

     public class MinaService extends Service{
    private String msg = "service bind success"; private final IBinder mBinder = new LocalBinder(); @Override
    public IBinder onBind(Intent intent) {
    Log.d("TEST", "onbind");
    //onBind service时会调用此方法,用于绑定Activity
    return mBinder;
    } @Override
    public void onCreate() {
    //开启服务时会首先调用该方法
    Log.d("TEST", "onCreate");
    super.onCreate();
    } @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
    //start service时会在onCreate后调用该方法
    Log.d("TEST", "start");
    return START_STICKY;
    } @Override
    public void onDestroy() {
    // 停止service后会调用此方法
    Log.d("TEST", "destroy");
    super.onDestroy();
    } @Override
    public boolean onUnbind(Intent intent) {
    //取消Activity与service绑定时要调用此方法
    Log.d("TEST", "onunbind");
    return super.onUnbind(intent);
    } @Override
    public void onRebind(Intent intent) {
    // 重新绑定时调用此方法
    Log.d("TEST", "onrebind");
    super.onRebind(intent);
    } /**
    * @author cpacm
    * 通过Binder返回service的引用到Activity中
    */
    public class LocalBinder extends Binder {
    MinaService getService() {
    return MinaService.this;
    }
    } //普通方法,证明service在后台运行
    public String getMsg(){
    return msg;
    }
    public void setMsg(String m){
    this.msg = m;
    } }
  2. 回到MainActivity中,来看一下我们需要做的处理
     public class MainActivity extends Activity implements OnClickListener{     private MinaService ms = null;
    private Button b1,b2,b3,b4,b5,b6;
    private TextView textView;
    private EditText editText;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    //获得界面的控件
    textView = (TextView) findViewById(R.id.textView1);
    editText = (EditText) findViewById(R.id.editText1);
    b1 = (Button) findViewById(R.id.button1);
    b1.setOnClickListener(this);
    b2 = (Button) findViewById(R.id.button2);
    b2.setOnClickListener(this);
    b3 = (Button) findViewById(R.id.button3);
    b3.setOnClickListener(this);
    b4 = (Button) findViewById(R.id.button4);
    b4.setOnClickListener(this);
    b5 = (Button) findViewById(R.id.button5);
    b5.setOnClickListener(this);
    b6 = (Button) findViewById(R.id.button6);
    b6.setOnClickListener(this);
    Log.d("TEST","===初始化完成===");
    } @Override
    public void onClick(View v) {
    // TODO Auto-generated method stub
    switch(v.getId()){
    case R.id.button1:{//按钮一:用startService开启服务
    Intent i = new Intent();
    i.setClass(MainActivity.this, MinaService.class);
    startService(i);
    break;
    }
    case R.id.button2:{//按钮二:停止服务
    Intent i = new Intent();
    i.setClass(MainActivity.this, MinaService.class);
    stopService(i);
    break;
    }
    case R.id.button3:{//按钮三:用bindService来绑定Service和Activity
    bindService(new Intent(MainActivity.this,
    MinaService.class), mConnection, Context.BIND_AUTO_CREATE);
    break;
    }
    case R.id.button4:{//取消绑定
    unbindService(mConnection);
    break;
    }
    case R.id.button5:{//跳转到下一个Activity
    Intent i = new Intent();
    i.setClass(MainActivity.this, SecondActivity.class);
    startActivity(i); break;
    }
    case R.id.button6:{//显示Service里面的信息
    textView.setText(ms.getMsg());
    ms.setMsg(editText.getText().toString());
    break;
    }
    }
    } public void show(String str){
    Toast.makeText(this, str, Toast.LENGTH_LONG).show();
    } private ServiceConnection mConnection = new ServiceConnection(){ /**
    * 绑定Service和Activity时会用到这个函数,所以可以在这里获取到Service的引用对象
    * @see android.content.ServiceConnection#onServiceConnected(android.content.ComponentName, android.os.IBinder)
    **/
    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
    //获取Service的引用对象
    ms = ((MinaService.LocalBinder)service).getService();
    Toast.makeText(MainActivity.this, "connect",
    Toast.LENGTH_SHORT).show();
    } /**
    * 这个函数是在绑定异常时调用,平时不会使用到这个函数
    * @see android.content.ServiceConnection#onServiceDisconnected(android.content.ComponentName)
    **/
    @Override
    public void onServiceDisconnected(ComponentName name) {
    // TODO Auto-generated method stub
    ms = null;
    Toast.makeText(MainActivity.this, "cutdown",
    Toast.LENGTH_SHORT).show();
    } }; }
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" > <LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical" > <TextView
    android:id="@+id/textView1"
    android:layout_width="match_parent"
    android:layout_height="57dp"
    android:text="TextView" /> <EditText
    android:id="@+id/editText1"
    android:layout_width="match_parent"
    android:layout_height="50dp"
    android:ems="10" > <requestFocus />
    </EditText> </LinearLayout> <LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical" >
    <Button
    android:id="@+id/button1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="start service" />
    <Button
    android:id="@+id/button2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="stop service" /> <Button
    android:id="@+id/button3"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="bind service" /> <Button
    android:id="@+id/button4"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="unbind service" /> <Button
    android:id="@+id/button5"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="next activity" /> <Button
    android:id="@+id/button6"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="set message" /> </LinearLayout></LinearLayout>

    activity_main

    再新建一个SecondActivity(不要忘记在AndroidManifest.xml里注册Activity),里面代码基本和MainActivity里一样,改一下这里

    case R.id.button5:{
    Intent i = new Intent();
    i.setClass(SecondActivity.this, MainActivity.class);
    startActivity(i);
    break;
    }

    以上就是Demo里面的组成部分了。接下来我们来看一下运行结果。

  3. 首先我们先启动项目,按下第一个按钮(start service),我们可以看到在LogCat里打印出
    【Android开发日记】之入门篇(五)——Android四大组件之Service

    可以看出项目先后调用了onCreate()和onStartCommand()。接下来按下第二个按钮(stop service)
    【Android开发日记】之入门篇(五)——Android四大组件之Service
    发现直接将service给destroy掉了。
    接下来我们用BindService来启动Service
    依次按下第三个和第四个按钮,结果如图
    【Android开发日记】之入门篇(五)——Android四大组件之Service
    可以发现BindService不会调用onStartCommand()方法,它会使用onbind来代替。unbind后,Service也是会摧毁。

    public boolean bindService(Intent service, ServiceConnection conn, int flags)

    该方法的第1个参数表示与服务类相关联的Intent对象,第2个参数是一个ServiceConnection类型的变量,负责连接Intent对象指定的服务。通过ServiceConnection对象可以获得连接成功或失败的状态,并可以获得连接后的服务对象。第3个参数是一个标志位,一般设为 Context.BIND_AUTO_CREATE。

  4. 如果我们想保持和 Service 的通信,又不想让 Service 随着 Activity 退出而退出呢?你可以先 startService() 然后再 bindService() 。当你不需要绑定的时候就执行 unbindService() 方法,执行这个方法只会触发 Service 的 onUnbind() 而不会把这个 Service 销毁。这样就可以既保持和 Service 的通信,也不会随着 Activity 销毁而销毁了。(销毁Service还是要调用StopService)

    在应用中,我们先按下第一个按钮,再按下第三个按钮,这样activity就获得了service的对象。现在我们改变service里的值,在输入框输入“Activity与Service通信”,按下第六个按钮。
    然后按下第五个按钮跳转到下一个Activity。在跳转到的Activity中,我们按下第三个按钮(onBind),在按下第六个按钮,你会发现文本框会出现“Activity与Service通信”的字符串。
    【Android开发日记】之入门篇(五)——Android四大组件之Service 【Android开发日记】之入门篇(五)——Android四大组件之Service
    从截图上看,第二个activity成功获得了service里面的值。(注意,跳转到下一个Activity前一定要unbind,不然会报错)

  5. 关于service的一些技巧:
    (1)可以在一个Activity启动Service,再在另一个Activity绑定。
    (2)可以多次start同一个Service(通过该方法,可以经由intent传递信息到Service中)
    (3)start->bind->stop,此时service还是存在的不会被销毁,但在调用unbind后,Service会被销毁。
    可能还会有更多的可能性组合,大家可以自己写个demo来好好研究。

五、结语

http://android.blog.51cto.com/268543/527314/

百度网盘)(过期的请CALL我)

http://www.cpacm.net/2015/03/22/Android开发日记(三)——Android四大组件之Service/

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,027
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,518
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,365
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,146
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,780
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,857