android studio后台服务使用详解

Service 是 Android 系统的服务组件,适用于开发没有用户界面且长时间在后台运行的功能。通过本次试验了解后台服务的基本原理,掌握本地服务的使用方法。

1、创建一个Service服务用来完成简单的求和和比较大小的数学运算。
2、创建Activity并调用该数学Service

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
 
    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal">
 
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="第一个数:">
 
        </TextView>
 
        <EditText
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:ems="10"
            android:id="@+id/firstnum"
            android:inputType="number"
            android:digits="1234567890.">
 
        </EditText>
    </LinearLayout>
 
    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="第二个数"/>
        <EditText
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:ems="10"
            android:id="@+id/second"
            android:inputType="number"
            android:digits="1234567890."/>
    </LinearLayout>
 
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/bind"
        android:text="绑定"/>
 
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/add"
        android:text="求和"/>
 
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/compare"
        android:text="比较大小"/>
 
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/unbind"
        android:text="解除绑定"/>
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/out"/>
 
 
</LinearLayout>
 
 
</androidx.constraintlayout.widget.ConstraintLayout>

MathService.java

package com.example.serviceexperiment;
 
import android.app.Service;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Binder;
import android.os.IBinder;
import android.widget.Toast;
 
public class MathService extends Service {
    //服务绑定
    final IBinder mBinder=new LocalBinder();
    public class LocalBinder extends Binder {
        MathService getService() {
            return MathService.this;
        }
    }
    public MathService() {
    }
 
    @Override
    public IBinder onBind(Intent intent) {
        // TODO: Return the communication channel to the service.
        return mBinder;
    }
    public boolean onUnbind(Intent intent){
        Toast.makeText(this,"取消本地绑定",Toast.LENGTH_SHORT).show();
        return false;
    }
    public Double Add(Double a,Double b){
        return a+b;
    }
    public boolean Compare(Double a,Double b){
        if(a>b){
            return true;
        };
        return false;
    }
}

MainActicity.java

package com.example.serviceexperiment;
 
import androidx.appcompat.app.AppCompatActivity;
 
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.text.Editable;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
 
public class MainActivity extends AppCompatActivity {
    private MathService mathService;
    private boolean isBound=false;
    TextView labelView;
    EditText firstnum;
    EditText secondnum;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        labelView=(TextView)findViewById(R.id.out);
        labelView.setText("两个数默认值都为0");
        firstnum=(EditText)findViewById(R.id.firstnum);
        secondnum=(EditText)findViewById(R.id.second);
        Button bindButton=(Button)findViewById(R.id.bind);
        Button unbindButton=(Button)findViewById(R.id.unbind);
        Button addButton=(Button)findViewById(R.id.add);
        Button compareButton=(Button)findViewById(R.id.compare);
        bindButton.setOnClickListener(new View.OnClickListener() {//绑定按钮
            @Override
            public void onClick(View view) {
                if(!isBound){
                    final Intent serviceIntent=new Intent(MainActivity.this,MathService.class);
                    bindService(serviceIntent,mConnection,Context.BIND_AUTO_CREATE);
                    isBound=true;
                    Toast.makeText(MainActivity.this,"本地绑定:MathService",Toast.LENGTH_SHORT).show();
                }
            }
        });
        unbindButton.setOnClickListener(new View.OnClickListener() {//解绑按钮
            @Override
            public void onClick(View view) {
                if(isBound){
                    isBound=false;
                    unbindService(mConnection);
                    mathService=null;
 
                    Toast.makeText(MainActivity.this,"取消本地绑定:MathService",Toast.LENGTH_SHORT).show();
                }
            }
        });
        addButton.setOnClickListener(new View.OnClickListener() {//调用服务加法
            @Override
            public void onClick(View view) {
 
                if(mathService==null){
                    Toast.makeText(MainActivity.this,"未绑定服务:MathService",Toast.LENGTH_SHORT).show();
                    return;
                }
 
                String firsttext=firstnum.getText().toString();
                Double a= 0.0;
                if(firsttext.length()!=0){
                    a=Double.parseDouble(firsttext);
                }
 
                String secondtext=secondnum.getText().toString();
                Double b= 0.0;
                if(secondtext.length()!=0){
                    b=Double.parseDouble(secondtext);
                }
                Double result=mathService.Add(a,b);
                String msg=String.valueOf(a)+"+"+String.valueOf(b)+"="+String.valueOf(result);
                labelView.setText(msg);
 
            }
        });
        compareButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if(mathService==null){
                    Toast.makeText(MainActivity.this,"未绑定服务:MathService",Toast.LENGTH_SHORT).show();
                    return;
                }
 
                String firsttext=firstnum.getText().toString();
                Double a= 0.0;
                if(firsttext.length()!=0){
                    a=Double.parseDouble(firsttext);
                }
 
                String secondtext=secondnum.getText().toString();
                Double b= 0.0;
                if(secondtext.length()!=0){
                    b=Double.parseDouble(secondtext);
                }
                boolean result=mathService.Compare(a,b);
                String msg;
                if(result){
 
                    msg=String.valueOf(a)+"和"+String.valueOf(b)+"中最大的数是"+String.valueOf(a);
                }else{
                    msg=String.valueOf(a)+"和"+String.valueOf(b)+"中最大的数是"+String.valueOf(b);
                }
                labelView.setText(msg);
            }
        });
    }
    private ServiceConnection mConnection=new ServiceConnection() {//绑定
        @Override
        public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
            mathService=((MathService.LocalBinder)iBinder).getService();
        }
 
        @Override
        public void onServiceDisconnected(ComponentName componentName) {
            mathService=null;
        }
    };
}

AndroidMainfest.xml中加入

<service
android:name=".MathService"
android:enabled="true"
android:exported="true"></service>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Android判断后台服务是否开启的两种方法实例详解

    Android判断后台服务是否开启的两种方法实例详解 最近项目用到后台上传,就开启了一个服务service. 但是刚开始用这种方法,有些机型不支持:酷派不支持.然后又换了第二种判断方法. // public boolean isServiceWork(Context mContext, String serviceName) { // boolean isWork = false; // ActivityManager myAM = (ActivityManager) mContext // .

  • Android中Service(后台服务)详解

    1.概念: (1).Service可以说是一个在后台运行的Activity.它不是一个单独的进程,它只需要应用告诉它要在后台做什么就可以了. (2).它要是实现和用户的交互的话需要通过通知栏或者是通过发送广播,UI去接收显示. (3).它的应用十分广泛,尤其是在框架层,应用更多的是对系统服务的调用. 2.作用: (1).它用于处理一些不干扰用户使用的后台操作.如下载,网络获取.播放音乐,他可以通过INTENT来开启,同时也可以绑定到宿主对象(调用者例如ACTIVITY上)来使用. (2).如果说

  • Android实现后台服务拍照功能

    一.背景介绍 最近在项目中遇到一个需求,实现一个后台拍照的功能.一开始在网上寻找解决方案,也尝试了很多种实现方式,都没有满意的方案.不过确定了难点:即拍照要先预览,然后再调用拍照方法.问题也随之而来,既然是要实现后台拍照,就希望能在Service中或者是异步的线程中进行,这和预览这个步骤有点相矛盾.那有什么方式能够既能正常的实现预览.拍照,又不让使用者察觉呢?想必大家也会想到一个取巧的办法:隐藏预览界面. 说明一下,这只是我在摸索中想到的一种解决方案,能很好的解决业务上的需求.对于像很多手机厂商

  • Android App后台服务报告工作状态实例

    本节讲运行在后台服务里的工作请求,如何向发送请求者报告状态.推荐用LocalBroadcastManager发送和接收状态,它限制了只有本app才能接收到广播. 从IntentService汇报状态 从IntentService发送工作请求状态给其他组件,先创建一个包含状态和数据的Intent.也可以添加action和URI到intent里. 下一步,调用 LocalBroadcastManager.sendBroadcast()发送Intent,应用中所有注册了接收该广播的接收器都能收到.Lo

  • android选择视频文件上传到后台服务器

    本文实例为大家分享了android选择视频文件上传到后台服务器的具体代码,供大家参考,具体内容如下 选择本地视频文件 附上Demo 首先第一步打开打开相册选择视频文件: Intent intent = new Intent(); intent.setType("video/*"); intent.setAction(Intent.ACTION_GET_CONTENT); intent.addCategory(Intent.CATEGORY_OPENABLE); ((Activity)

  • Android中使用IntentService创建后台服务实例

    IntentService提供了在单个后台线程运行操作的简单结构.这允许它操作耗时操作,而不影响UI响应.同样,IntentService也不影响UI生命周期事件,所以,它在某些可能关闭AsyncTask的情况下,仍会继续运行(实测在Activity的onDestory里写AsyncTask无法运行). IntentService有如下限制: 1.它不能直接影响UI.要把结果反映给UI,需要发给Activity 2.工作请求会顺序运行.如果一个操作未结束,后面发送的操作必须等它结束(单线程) 3

  • android studio后台服务使用详解

    Service 是 Android 系统的服务组件,适用于开发没有用户界面且长时间在后台运行的功能.通过本次试验了解后台服务的基本原理,掌握本地服务的使用方法. 1.创建一个Service服务用来完成简单的求和和比较大小的数学运算.2.创建Activity并调用该数学Service activity_main.xml <?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.

  • Android组件之服务的详解

    目录 一.服务的概念 二.Android的多线程编程 2.1 线程的基本用法 2.2 在子线程中更新UI 更新方式一 更新方式二 2.3 解析异步消息处理机制 2.4 使用AsyncTask 三.服务的基本用法 3.1 首先定义一个服务 3.2 MyService类里重写几个方法 3.3 在注册文件中完成对服务的注册 3.4 启动和停止服务 3.5 活动和服务进行通信 四.服务的生命周期 五.服务的更多技巧 5.1 使用前台服务 5.2 服务中的多线程问题&IntentService 一.服务的

  • Android pdf viewer在android studio应用问题说明详解

    之前一直是做.NET开发的,最近需要弄一个新闻app,能力有限,只能借助HTML5 WebAPP+android studio来完成这项工作. android studio主要用WebView来加载发布好的WebApp,打包生产APP. 其中由于显示一些pdf文档,所以研究了一下,记录一下心得,同时也希望帮助到新手们. android 显示网络pdf,基本原理:先将pdf文件通过DownloadManager下载到手机sdk某个文件夹中,然后通过android-pdf-viewer插件进行显示.

  • sweet alert dialog 在android studio应用问题说明详解

    看到这个sweet-alert-dialog很亲切,因为前端开发本人用的提示就是这个js插件,java牛人很厉害,直接弄成一个java包插件,Good! 下面记录如何引用到工程,并使用: sweet-alert-dialog插件可以直接到github上下载 地址:https://github.com/pedant/sweet-alert-dialog 或者直接到发布好的页面下载: https://github.com/pedant/sweet-alert-dialog/releases 我下载的

  • Android Studio中debug功能详解

    本文为大家分享了Android Studio debug功能的具体使用方法,供大家参考,具体内容如下 运行debug模式 1. 进入debug - 点击图中红色圆圈圈起的左边绿色按钮,运行app的debug模式,快捷键Shift+F9 - 点击图中红色圆圈圈起的右边按钮,可以选择正在运行的进程attach debugger 1. 打断点:鼠标点击编辑框左侧,出现红色圆点 断点分类 这张图可以看出断点也有行断点.方法断点.字段断点.异常断点.其实打断点仔细观察也可以发现它们的标识图片是不同的,就是

  • Android Studio OkHttpClient使用教程详解

    本次来记录下OkHttpClient的使用,OkHttpClient是用来完成android 客户端对服务端请求的工具. 首先记住,使用网络的时候一定要加入权限,加入到AndroidMainfest.xml中 <uses-permission android:name="android.permission.INTERNET" /> 在初次使用的时候会出现报错.cannot resolve symbol OkHttpClient 这里需要引入 implementation

  • android studio广播机制使用详解

    Intent 是一种消息传播机制,用于组件之间数据交换和发送广播消息.通过本次实验了解 Android 系统的组件通信原理,掌握利用 Intent 启动其他组件的方法,以及利用 Intent 获取信息和发送广播消息的方法. 1.实现具有“登录”按钮的主界面,输入用户名.密码,点击登录按钮后,经过判断进入一个广播Activity(需要传递主界面的用户名) 2.在广播Activity中,输入信息,点击发送广播按钮发送广播,并且在广播接收器中接收广播并显示. activity.xml <?xml ve

  • Android O对后台Service限制详解

    目录 Service问题 什么是前台应用 前台Service和后台Service 后台Service限制 解决后台Service限制 Service问题 Service没有界面,运行于后台,它会消耗设备资源,并且可能会导致不好的用户体验,例如资源占用过多,导致设备运行不流畅.为了缓解这个问题,Android O版本(Android 8.0, API 26)对后台Service强加了一些限制.注意,只是对后台Service加了限制,前台Service不受影响. 什么是前台应用 在解释后台Servi

  • Android 中Manifest.xml文件详解

    Android 中Manifest.xml文件详解 每一个Android项目都包含一个清单(Manifest)文件--AndroidManifest.xml,它存储在项目层次中的最底层.清单可以定义应用程序及其组件的结构和元数据. 它包含了组成应用程序的每一个组件(活动.服务.内容提供器和广播接收器)的节点,并使用Intent过滤器和权限来确定这些组件之间以及这些组件和其他应用程序是如何交互的. 它还提供了各种属性来详细地说明应用程序的元数据(如它的图标或者主题)以及额外的可用来进行安全设置和单

随机推荐