`
jiav_net
  • 浏览: 110221 次
文章分类
社区版块
存档分类
最新评论

【项目总结】-Android Service用法总结

 
阅读更多

Android Service组件在后台不可见,但一般情况下是与其他组件一同运行在一个进程中的(Local Service与其他部分在一个进程,Remote Service单独开进程),而且在主线程中,并不单独启动一个线程(除非程序员自己另外开线程)


Service组件提供了后台执行某些功能以及为其他应用程序提供服务,提供支撑功能的能力。


生命周期:OnCreate()->OnStartCommand()->OnDestroy()。

调用 Context.startService()可以多次调用,但只要调用stopService一次就会stop.多次调用startService或者bindService不会启动多个服务。


local service样例


public class LocalService extends Service {
    private NotificationManager mNM;

    // Unique Identification Number for the Notification.
    // We use it on Notification start, and to cancel it.
    private int NOTIFICATION = R.string.local_service_started;

    /**
     * Class for clients to access.  Because we know this service always
     * runs in the same process as its clients, we don't need to deal with
     * IPC.
     */
    public class LocalBinder extends Binder {
        LocalService getService() {
            return LocalService.this;
        }
    }

    @Override
    public void onCreate() {
        mNM = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);

        // Display a notification about us starting.  We put an icon in the status bar.
        showNotification();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.i("LocalService", "Received start id " + startId + ": " + intent);
        // We want this service to continue running until it is explicitly
        // stopped, so return sticky.
        return START_STICKY;
    }

    @Override
    public void onDestroy() {
        // Cancel the persistent notification.
        mNM.cancel(NOTIFICATION);

        // Tell the user we stopped.
        Toast.makeText(this, R.string.local_service_stopped, Toast.LENGTH_SHORT).show();
    }

    @Override
    public IBinder onBind(Intent intent) {
        return mBinder;
    }

    // This is the object that receives interactions from clients.  See
    // RemoteService for a more complete example.
    private final IBinder mBinder = new LocalBinder();

    /**
     * Show a notification while this service is running.
     */
    private void showNotification() {
        // In this sample, we'll use the same text for the ticker and the expanded notification
        CharSequence text = getText(R.string.local_service_started);

        // Set the icon, scrolling text and timestamp
        Notification notification = new Notification(R.drawable.stat_sample, text,
                System.currentTimeMillis());

        // The PendingIntent to launch our activity if the user selects this notification
        PendingIntent contentIntent = PendingIntent.getActivity(this, 0,
                new Intent(this, LocalServiceActivities.Controller.class), 0);

        // Set the info for the views that show in the notification panel.
        notification.setLatestEventInfo(this, getText(R.string.local_service_label),
                       text, contentIntent);

        // Send the notification.
        mNM.notify(NOTIFICATION, notification);
    }
}
调用

private LocalService mBoundService;

private ServiceConnection mConnection = new ServiceConnection() {
    public void onServiceConnected(ComponentName className, IBinder service) {
        // This is called when the connection with the service has been
        // established, giving us the service object we can use to
        // interact with the service.  Because we have bound to a explicit
        // service that we know is running in our own process, we can
        // cast its IBinder to a concrete class and directly access it.
        mBoundService = ((LocalService.LocalBinder)service).getService();

        // Tell the user about this for our demo.
        Toast.makeText(Binding.this, R.string.local_service_connected,
                Toast.LENGTH_SHORT).show();
    }

    public void onServiceDisconnected(ComponentName className) {
        // This is called when the connection with the service has been
        // unexpectedly disconnected -- that is, its process crashed.
        // Because it is running in our same process, we should never
        // see this happen.
        mBoundService = null;
        Toast.makeText(Binding.this, R.string.local_service_disconnected,
                Toast.LENGTH_SHORT).show();
    }
};

void doBindService() {
    // Establish a connection with the service.  We use an explicit
    // class name because we want a specific service implementation that
    // we know will be running in our own process (and thus won't be
    // supporting component replacement by other applications).
    bindService(new Intent(Binding.this, 
            LocalService.class), mConnection, Context.BIND_AUTO_CREATE);
    mIsBound = true;
}

void doUnbindService() {
    if (mIsBound) {
        // Detach our existing connection.
        unbindService(mConnection);
        mIsBound = false;
    }
}

@Override
protected void onDestroy() {
    super.onDestroy();
    doUnbindService();
}
在Activity中通过mBoundService调用Service中的public方法来获取后台数据,实际上onServiceConnected中返回的是一个IBinder对象,只不过我们在此已经确定Local Service

已经在执行了,可以进行强制类型转换。


Local Service可以通过发送广播来给前台提供后台数据更新,前台只需要注册一个Receiver既可以与Service通讯。

例子:

后台Service的某个方法进行数据更新后执行

Intent intent = new Intent("XXXX_Message");

sendBroadcast(intent); 通知前台数据已经更新

前台

private MessageReceiver receiver;

class MessageReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context arg0, Intent arg1) {
String action = arg1.getAction();
if (action.equals("XXXX_Message")) {
//从Service接收广播消息
String msgStr = arg1.getStringExtra("msg_str");
}
}
}



@Override
protected void onResume() {

super.onResume();

IntentFilter filter = new IntentFilter("XXXX_Message");
if (receiver == null)
receiver = new MessageReceiver();
//注册BroadcastReceiver
registerReceiver(receiver, filter);
}



@Override
protected void onPause() {
unregisterReceiver(receiver);
super.onPause();
}


分享到:
评论

相关推荐

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

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

    WordPress-Android-develop

    总结来说,通过研究WordPress-Android-develop项目,开发者可以学习到Android应用的基本架构,如何利用WordPress REST API,使用网络请求库进行数据交互,本地数据存储的方法,UI设计技巧,以及安全性和权限管理的...

    android笔记--Service与AIDL

    在Android系统中,Service是四大组件之一,它用于在后台执行长时间运行的操作,不与用户界面...通过阅读博客“android笔记--Service与AIDL”,开发者可以深入了解这两个组件的原理和使用技巧,提升Android开发能力。

    native-service-master.zip_Android Native_android_android service

    总结来说,"native-service-master.zip"提供的示例项目旨在帮助开发者学习如何在Android平台上创建和管理原生服务,包括使用JNI、NDK、AIDL以及处理线程和同步问题。这个项目将提供实践操作经验,加深对Android ...

    git-osc-android-master.zip

    项目中的XML布局文件展示了Android界面设计的方法,包括如何使用LinearLayout、RelativeLayout、ConstraintLayout等布局,以及自定义View和Adapter的实现。 8. **测试与调试** 了解项目的测试代码,可以学习单元...

    ksoap2-android-3.6.2 for webservice

    在Android平台上进行Web服务(尤其是基于SOAP的Web Service)的交互时,开发者通常会使用到一个名为ksoap2-android的库。标题中的"ksoap2-android-3.6.2 for WebService"指的是这个库的一个特定版本,即3.6.2。ksoap...

    Android_Service多线程断点下载

    - 创建Service:通过继承`android.app.Service`并重写其生命周期方法,如`onStartCommand()`和`onBind()`。 - 启动Service:通过`startService()`启动,仅执行一次任务,不需要返回结果。 - 绑定Service:通过`...

    gpio-android-api

    总结来说,"gpio-android-api"是一个关于Android平台上GPIO接口使用的教程或库,涵盖了从驱动开发到Java应用层的完整流程,特别是针对LED控制的应用。通过学习这个API,开发者可以掌握如何在Android设备上进行硬件...

    安卓串口Socket通讯USB驱动jni相关-androidJNI进程守护service.rar

    总结来说,这个项目涉及了Android应用开发的多个高级领域,包括JNI、Service、串口通信、Socket通信以及USB驱动开发,对于提升Android开发者在硬件交互方面的技能非常有帮助。通过阅读和分析提供的源码,开发者可以...

    Android Service简单实例

    本篇文章将深入探讨`startService`类型的Android Service,通过一个简单的实例来展示其工作原理和使用方法。 `Service`分为两种主要类型:`Start Service`和`Bound Service`。`Start Service`主要用于执行非交互式...

    Android Service大总结Demo

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

    android service

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

    android service基本用法

    本教程将深入探讨Android Service的基本用法,通过一个名为"ServiceDemo"的示例项目来阐述关键概念。 首先,创建一个新的Android工程并添加一个Service。在AndroidManifest.xml文件中声明Service,例如: ```xml ...

    Android代码-AndroidComponent

    理解并掌握组件化的理念和实践方法,对于提升Android开发者的技术水平和项目管理能力具有重要意义。对于`AndroidComponent-master`这个项目,你可以下载源码进行深入研究,了解其具体的实现方式和技巧。

    Android停止Service的例程

    总结,理解Service的启动与停止机制以及生命周期管理对于优化Android应用性能和用户体验至关重要。通过源码学习,可以更深入地了解Service的工作原理,并在实际项目中做出更优的决策。在实践中,要始终遵循最佳实践...

    the-busy-coders-guide-to-android-development.pdf

    ### 《忙碌程序员的安卓开发指南》核心知识点总结 #### 一、书籍概述与作者介绍 **《忙碌程序员的安卓开发指南》**是一本由**Mark L. Murphy**编写的关于Android开发的专业书籍。该书版权归属于CommonsWare, LLC,...

    android 进程之间通信--Android 使用【AIDL】调用外部服务

    首先,在你的Android项目中创建一个`.aidl`文件,例如`IRemoteService.aidl`。在该文件中,定义你需要暴露给其他进程的方法。例如: ```aidl package com.example.aidlexample; interface IRemoteService { ...

    Android代码-Android开发总结资料

    2. **基础语法与布局设计**:学习Java语言基础,理解Android应用程序的四大组件(Activity、Service、BroadcastReceiver、ContentProvider)的用法。同时,掌握XML布局文件的编写,了解各种视图组件(TextView、...

    android service 之一 (start service)

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

    Android service start方式启动

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

Global site tag (gtag.js) - Google Analytics