`
l540151663
  • 浏览: 185462 次
  • 性别: Icon_minigender_1
  • 来自: 浙江
社区版块
存档分类
最新评论

Android的Service总结

 
阅读更多
参考链接:http://www.cnblogs.com/lwbqqyumidi/p/4181185.html

  Android上经常会碰到Service,用到的都比较零散,今天比较全面的了解了下。

  Service也是组件之一,如需使用,需要在清单文件中注册。代码如下:
  <service
    android:exported=["true" | "false"]
    android:icon="drawable resource"
    android:name="string"
    android:process="string" >
    . . .
  </service>
  上面是用到较多的几个属性,name为服务类,process为进程名。exported是否允许远程调用。

下面是简单的实现service类:
import android.app.Service;
import android.content.Intent;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.os.Messenger;
import android.os.RemoteException;
import android.util.Log;


public class MyService extends Service {

    public static final int MSG_SEND_TO_SERVER = 1;
    public static final int MSG_SEND_TO_CLIENT = 2;

    private Messenger mClientMessenger;
    private Messenger mServerMessenger = new Messenger(new ServerHandler());

    private static int mark =1;

    @Override
    public IBinder onBind(Intent intent) {
        return mServerMessenger.getBinder();
    }

    class ServerHandler extends Handler {

        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case MSG_SEND_TO_SERVER:
                    mClientMessenger = msg.replyTo;
                    Message toClientMsg = Message.obtain(null, MSG_SEND_TO_CLIENT);
                    toClientMsg.obj = "来自Service:" + mark;
                    try {
                        mClientMessenger.send(toClientMsg);
                    } catch (RemoteException e) {
                        e.printStackTrace();
                    }
                    mark++;
                    break;
                default:
                    super.handleMessage(msg);
            }
        }
    }

    @Override
    public boolean onUnbind(Intent intent) {
        return super.onUnbind(intent);
    }

    @Override
    public void onDestroy() {
        Log.e("123","onDestroy");
        super.onDestroy();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        return START_STICKY;
    }
}

Activity调用service简单代码如下:
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.os.Messenger;
import android.os.RemoteException;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    private TextView tvRecord;
    private Button btnBindService;
    private Button btnStartService;
    private Button btnSend;
    private Button btnUnBindService;
    private Button btnStopService;

    private ServiceConnection sc = new MyServiceConnnect();
    private boolean isConnnect =false;


    private Messenger mServerMessenger;
    private Handler mClientHandler = new MyClientHandler();
    private Messenger mClientMessenger = new Messenger(mClientHandler);

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        findView();
        setListener();
    }

    private void setListener(){
        btnBindService.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this, MyService.class);
                bindService(intent, sc, Context.BIND_AUTO_CREATE);
            }
        });
        btnStartService.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this, MyService.class);
                startService(intent);
            }
        });
        btnSend.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v) {
                send();
            }
        });
        btnStopService.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this, MyService.class);
                stopService(intent);
            }
        });
        btnUnBindService.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(isConnnect) {
                    unbindService(sc);
                    isConnnect = false;
                }
            }
        });
    }

    private void send(){
        if (!isConnnect){
            return;
        }
        Message msg = Message.obtain(null, MyService.MSG_SEND_TO_SERVER);
        msg.replyTo = mClientMessenger;
        try {
            mServerMessenger.send(msg);
        } catch (RemoteException e) {
            e.printStackTrace();
        }
    }

    private void findView(){
        tvRecord = (TextView)findViewById(R.id.tv_record);
        btnBindService = (Button) findViewById(R.id.btn_bind);
        btnStartService = (Button)findViewById(R.id.btn_start);
        btnSend = (Button)findViewById(R.id.btn_send);
        btnStopService = (Button)findViewById(R.id.btn_stop);
        btnUnBindService = (Button)findViewById(R.id.btn_unbind);
    }

    class MyClientHandler extends Handler{
        @Override
        public void handleMessage(Message msg) {
            if (msg.what == MyService.MSG_SEND_TO_CLIENT) {
                String obj = (String)msg.obj;
                tvRecord.setText(obj);
            }
        }
    }

    class MyServiceConnnect implements ServiceConnection{
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            mServerMessenger = new Messenger(service);
            isConnnect =true;
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            isConnnect =false;
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();

    }
}


  一般启动服务有两方法:startService和bindService。
  startService比较简单,通过stopService结束。当服务已经启动,则不会调用oncreate方法,直接调用onStartCommand。startCommand的返回值意义如下:
START_NOT_STICKY:当Service因为内存不足而被系统kill后,接下来未来的某个时间内,即使系统内存足够可用,系统也不会尝试重新创建此Service。除非程序中Client明确再次调用startService(...)启动此Service。

START_STICKY:当Service因为内存不足而被系统kill后,接下来未来的某个时间内,当系统内存足够可用的情况下,系统将会尝试重新创建此Service,一旦创建成功后将回调onStartCommand(...)方法,但其中的Intent将是null,pendingintent除外。

START_REDELIVER_INTENT:与START_STICKY唯一不同的是,回调onStartCommand(...)方法时,其中的Intent将是非空,将是最后一次调用startService(...)中的intent。

START_STICKY_COMPATIBILITY:compatibility version of {@link #START_STICKY} that does not guarantee that {@link #onStartCommand} will be called again after being killed。此值一般不会使用,所以注意前面三种情形就好。

  bindService也可启动服务,可通过unbindService结束,此方法可通过接口,通过信使通信。具体代码如上。如通过bindservice启动的服务,需关闭所有的依赖才可结束服务。
分享到:
评论

相关推荐

    android service总结文档

    一篇对于android service的详细总结

    Android Service总结及详细介绍

    Android Service是Android操作系统中的一个重要组件,用于在后台长时间运行任务,即使用户界面已经关闭。Service不同于线程,尽管它们都可以用于执行后台操作,但Service提供了更高级别的抽象和与应用程序交互的能力...

    Android-Service与Activity传值

    总结来说,`Service`和`Activity`之间的数据传递可以通过Intent参数、BroadcastReceiver或Binder实现。BroadcastReceiver适用于不频繁的数据交换,而Binder适合需要频繁交互且在同一个进程的情况。开发者应根据具体...

    android service的小实例

    总结起来,Android Service提供了多种启动方式,根据应用场景选择合适的方式可以优化性能和用户体验。启动方式适用于无需频繁交互的后台任务,绑定方式适用于需要与Service紧密交互的情况,线程方式确保Service不会...

    Android Service简单实例

    总结起来,`Start Service`在Android中主要用于执行后台任务,它不会直接与启动它的组件进行交互,而是独立运行。理解并正确使用`Start Service`对于开发能够后台运行的应用至关重要。在实际项目中,根据需求选择...

    android service

    总结来说,“android service”是Android开发中的核心概念,它支持后台运行,是实现持久化操作的关键。通过深入学习Service的源码,结合各种工具进行调试和分析,开发者可以更高效地利用Service实现复杂的功能,同时...

    Android Service Demo

    总结来说,"Android Service Demo"是一个学习如何在Android应用中实现后台服务的实例。它涵盖了Service的创建、启动、绑定和生命周期管理,对于理解Android服务的工作原理及其在实际应用中的使用非常有帮助。通过...

    Android Service大总结Demo

    本示例"Android Service大总结Demo"将深入探讨Service的使用,包括如何启动、绑定服务,以及实现跨进程间的通信。我们将详细讲解以下几个关键知识点: 1. **Service的基本概念**: - Service是一种没有用户界面的...

    Android Service与Activity交互

    在Android应用开发中,Service和Activity是两个非常重要的组件,它们各自扮演着不同的角色。Service主要负责在后台执行长时间运行的任务,而Activity则用于与用户交互。本示例"Android Service与Activity交互"旨在...

    android学习之Service启动1

    总结起来,理解并掌握Service的启动方式和生命周期管理是Android开发中的重要环节。在实际应用中,根据需求选择合适的启动模式,并确保服务的运行效率和用户体验。通过`com.njupt.zhb.MusicPlay`这样的练习,可以...

    Android 远程服务(remote service)

    总结来说,Android远程服务是实现跨进程通信的重要手段,通过AIDL和Binder机制,我们可以构建出高效、稳定的服务架构。正确理解和运用远程服务,可以为Android应用开发带来更大的灵活性和扩展性。在实际开发中,根据...

    Android---Service Timer之执行周期任务

    总结起来,Android的Service和Timer是强大的工具,它们可以帮助开发者实现在后台的定时任务。正确地使用它们,可以提高应用的功能性和用户体验。然而,需要注意的是,频繁的后台操作可能会消耗较多的系统资源,因此...

    Android notification+Service实时更新

    总结来说,这个项目通过`Notification`、`Service`和`BroadcastReceiver`实现了后台文件下载并实时通知用户的功能。`Notification`提供用户界面反馈,`Service`负责文件下载,`BroadcastReceiver`监听并处理下载状态...

    Android service start方式启动

    总结一下,`startService()`是Android中启动服务的关键方法,适用于需要后台长期运行的任务。理解并正确使用服务可以极大地增强你的应用功能,但也要注意资源管理,避免过度消耗设备资源。通过学习和实践`Android_...

    android service弹出对话框

    总结来说,要在Android Service中弹出对话框,需要创建一个兼容Service的Context,使用新线程或Handler来显示Dialog,并根据Service的生命周期进行适当的管理。对于复杂的需求,可以考虑使用DialogFragment。同时,...

    Android Service之start实现

    总结来说,`startService()`是Android中启动服务的一种方式,适用于执行非交互的后台任务。在使用时,需要正确处理Service的生命周期方法,确保服务在必要时启动和停止,并遵循Android的后台服务最佳实践,以提供...

    Android Service之bound实现

    总结起来,Android中的Bound Service是一种允许应用程序组件与服务进行交互的服务类型,通过`IBinder`接口进行通信,提供了一种更加灵活且高效的服务使用方式。理解并熟练掌握Bound Service的实现和使用,对于开发...

    android service 之一 (start service)

    总结起来,Start Service是Android中用于启动后台任务的重要工具,正确理解和使用它可以提升应用的用户体验,但同时也需要注意资源管理和生命周期管理,以保证应用的稳定性和效率。在`ServiceDemo`项目中,我们可以...

    Android中Service组件的使用

    总结一下,Android的Service组件用于执行后台任务,可以通过startService()和stopService()控制其生命周期。Service与外部通信依赖于Binder和IBinder,通过实现IBinder接口,Service可以暴露自己的方法供其他组件...

    Android之Service实现比较大小

    总结来说,Android Service根据其启动模式和使用场景有不同的行为和生命周期管理。开发者需要根据实际需求选择合适的启动模式,并注意系统对后台服务的限制。在设计Service时,应尽量减少对CPU和内存的占用,避免...

Global site tag (gtag.js) - Google Analytics