Android 四大组件之 Service (下)

Flannel,Calico 和 Cilium 之间有哪些优缺点和差别? 例如,在一个多租户的容器集群中,可以通过Calico为不同租户的容器设置精细的访问控制策略,确保每个租户的资源安全。例如,在设置复杂的网络策略和BGP路由时,需要对网络概念和Calico的配置语法有比较深入的了解。它可以根据容器的标签、服务等信息来定义访问规则,并且可以实现更加细粒度的网络安全策略,如HTTP层的策略。性能损耗:在overlay网络模式下(如VXLAN),由于需要对数据包进行额外的封装和解封装操作,会带来一定的性能损耗,尤其是在高流量的场景下,这种性能损耗可能会更加明显。 阅读详情

       上篇文章中我们学习了服务的概念、服务的基本用法,包括启动和停止服务、活动和服务进行通信、服务的生命周期,如何销毁服务等内容,这些都是我们日常用到的,不过还有一些更加高端的服务技术需要我们学习,如果你还对服务不是很了解可以去查看上一篇文章,文章地址:Android 四大组件之 Service(上),今天我们就一起来学习更多 Service 相关的内容,接下来我们开始演绎


一、Service 和 Thread 之间的关系


      这里我们先来探究一下这两个事物之间的概念关系问题,其实这个东西本来就是没有任何关系的,但不知为什么面试中还会经常问道,既然说起来了,那我们不妨就来理一下,Service 是四大组件,是后台服务,用来处理长时间运行在后台的场景下的任务,Thread 是用来开启一个子线程的,在子线程里去处理一些耗时的操作,总结如下:

  • Service 是 Andriod 中的系统组件,它运行在独立进程的主线程中,不可以执行耗时操作,Thread 是程序执行的最小单元,分配 cpu 的基本单位,可以开启子线程执行耗时操作
  • Service 在不同的 Activity 中可以获取自身实例,可以方便的对 Service 进行操作,Thread 在不同的 Activity 中难以获取自身的实例,如果Activity 被销毁,Thread 实例就很难再获取得到

我们通过代码来具体的看一下吧,这样更明了一点


1)在 MainActivity 中打印当前线程:




2)在 MyService 中打印当前线程:



       

       从打印情况可以到 MainActivity 和 MyService 的线程 id 是完全一样的,那么由此证实 Service 是运行在主线程里的,到这里想必大家就知道为什么一开始就说 Service 和 Thread 之间没有任何关系,还要注意的是既然 Service 是运行在主线程里的,那么也就是说我们在编代码时要特别注意,不能在 Service 里面编写非常耗时的操作,否则程序会出现 ANR(Application Not Responding),这样的话我们在做耗时的任务时就需要在 Service 中再创建一个子线程,然后在子线程里去处理耗时逻辑的问题,在这里还要注意的是,我们为什么要在 Service 里去创建一个子线程,而不直接在 Activity 中去创建,这是因为 Activity 很难对 Thread 进行控制,当 Acitivty 被销毁后,就没有其他办法获取到之前创建的的子线程实例,而且在一个 Activity 中创建子线程,另一个 Activity 无法对其进行操作,而 Service 就不一样,所有 Activity 都可以与 Service 进行关联,然后操作其中的方法,即使 Activity 被销毁了,之后只要与 Service 建立关联,就可以重新获取到原有 Service 中 Binder 中的实例,所以,使用 Service 来处理后台任务,Activity 即使销毁,后台任务任然可以运行


我们在 MyService 的 onCreate() 方法中添加如下操作:

    @Override
    public void onCreate() {
        Log.i(TAG, "MyService 所在的线程是:" + Thread.currentThread().getId());
        super.onCreate();
        try {
            Thread.sleep(60000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }

下面我们看一下如果在主线程有耗时操作的情况:




可以看到程序无效应,我们再看一下日志的打印情况:




说我们可能在主线程中做了耗时的操作

所以为防止 ANR,在写 Service 时可以如下:

 //模仿方法
        public void startDownload() {

            new Thread(new Runnable() {
                @Override
                public void run() {
                    // 执行具体的下载任务
                }
            }).start();
            Log.d(TAG, "startDownload");
        }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                //处理具体的逻辑
                
                //这个方法一定切记要记得写,自动关闭功能
                stopSelf();
            }
        }).start();
        return super.onStartCommand(intent, flags, startId);
    }

       服务一旦启动后,就会一直运行在后台,处于运行状态,必须调用 stopService() 或者 stopSelf() 方法才能让服务停下来,所以要想让一个服务执行完毕自动停止就得像上面一样写 


二、前台 Service


       服务几乎都是在后台运行的,但是服务系统的优先级比较低,当系统出现内存情况不足时,就有可能回收掉后台正在运行的服务,如果服务需要一直保持运行状态,不被由于系统内存不足回收,就可以使用前台服务,前台服务和普通服务最大的区别就是,它可以在状态栏看到,接下来我们就来创建一个前台服务

这里我们新建一个 WeatherService 实现前台服务:

public class WeatherService extends Service {
    private static final int NOTIFY_ID = 1;

    public WeatherService() {
    }

    @Override
    public IBinder onBind(Intent intent) {
        throw new UnsupportedOperationException("Not yet implemented");
    }

    @Override
    public void onCreate() {
        super.onCreate();
        showNotification();
    }

    /**
     * 在通知栏显示天气信息
     */
    private void showNotification() {
        NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this)
                .setSmallIcon(R.mipmap.ic_launcher)
                .setContentTitle("2017年8月10日")
                .setContentText("今天天气不错");
        //创建通知被点击时触发的 Intent
        Intent intent = new Intent(this, MainActivity.class);
        //创建任务栈 Builder
        TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
        stackBuilder.addParentStack(MainActivity.class);
        stackBuilder.addNextIntent(intent);
        PendingIntent pendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
        mBuilder.setContentIntent(pendingIntent);
        NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

        //构建通知
        final Notification notification = mBuilder.build();
        //显示通知
        mNotificationManager.notify(NOTIFY_ID, notification);
        //启动为前台服务
        startForeground(NOTIFY_ID, notification);
    }
}


        我们在 onCreate() 方法中调用 showNotification() 方法显示通知,并且在最后调用 startForeground() 方法将服务设置为前台服务,并且在 MainActivity 中启动此服务,效果如下:




到这里我们的一个前台服务就启动起来了,并且在状态栏中显示了出来


三、IntentService


       从上面文章中我们知道服务是运行在主线程里的,如果直接去服务里处理一些耗时的操作,很容易出现 ANR 的情况,上面我们也对这种情况做了处理,就是开启子线程,其实 Android 系统也早就洞察了这个需求,专门提供了一个 IntentService 类,来解决这个问题,接下来我们就来看看 IntentService 的使用

这里我们创建了一个 MyIntentService 类继承自 IntentService,代码如下:

/**
 * IntentService 测试类
 * Created by qiudengjiao on 2017/8/10.
 */

public class MyIntentService extends IntentService {
    private static final String TAG = "MyIntentService";

    public MyIntentService() {
        super("MyIntentService");
    }

    @Override
    protected void onHandleIntent(@Nullable Intent intent) {
        Log.i(TAG, "MyIntentService 所在的线程是:" + Thread.currentThread().getId());
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.i(TAG, "onDestroy");
    }
}

       这里提供了一个无参的构造函数,并且必须在其内部调用父类的有参构造函数,然后在子类中实现 onHandleIntent() 这个抽象方法,在这个方法里处理一些具体的逻辑,而不用担心 ANR 的问题,因为这个方法已经是在主线程中去运行的了,而且运行结束后服务会自动停止,为了证实,我们在 onHandleIntent() 方法中打印了当前的线程 id,并且在  onDestory() 方法中也打印了一行日志,证实服务是否会自动停止,我们来看一下打印情况:




我们看到它们的线程确实不一样,而且进行了自动关闭

我们来看一下  IntentService 的源码:


public abstract class IntentService extends Service {
    private volatile Looper mServiceLooper;
    private volatile ServiceHandler mServiceHandler;
    private String mName;
    private boolean mRedelivery;

    private final class ServiceHandler extends Handler {
        public ServiceHandler(Looper looper) {
            super(looper);
        }

        @Override
        public void handleMessage(Message msg) {
            onHandleIntent((Intent)msg.obj);
            stopSelf(msg.arg1);
        }
    }


    public IntentService(String name) {
        super();
        mName = name;
    }


    public void setIntentRedelivery(boolean enabled) {
        mRedelivery = enabled;
    }

    @Override
    public void onCreate() {
                super.onCreate();
        HandlerThread thread = new HandlerThread("IntentService[" + mName + "]");
        thread.start();

        mServiceLooper = thread.getLooper();
        mServiceHandler = new ServiceHandler(mServiceLooper);
    }

    @Override
    public void onStart(Intent intent, int startId) {
        Message msg = mServiceHandler.obtainMessage();
        msg.arg1 = startId;
        msg.obj = intent;
        mServiceHandler.sendMessage(msg);
    }


    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        onStart(intent, startId);
        return mRedelivery ? START_REDELIVER_INTENT : START_NOT_STICKY;
    }

    @Override
    public void onDestroy() {
        mServiceLooper.quit();
    }


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


    protected abstract void onHandleIntent(Intent intent);
}

       相信大家都明白了,其实 onHandleInent() 方法的实现思路也是和我们一样的,大家可以看到,在 handleMesage() 中调用了onHandleIntent() 方法,接下下来就调用了 stopService,另外在 onCreate() 方法中初始化了一个 HandlerThread,调用 onStartCommand() 方法的时候,通过 mServiceHandler 发送了一个消息,消息中包含我们的 Intent,然后在该 mServiceHandler 的 handleMessage 中去回调 onHandleIntent(intent) 就可以了,当前任务完成销毁 Service 回调 onDestory() 方法,在 onDestory() 方法中释放我们的 Looper:mServiceLooper.quit()

到这里我们就介绍完了,如有错误请指出

参考:郭神第一行代码




















        
Seurat-SCTransform与harmony整合学习 源于R tips:Seurat之SCTransform方法原理 (qq.com)Seurat对象在经过SCTransform处理后会增加一个SCT的Assay,里面的scaled.data就是经过scale之后的pearson residual值,这个值是用于后续降维聚类分析使用的。 阅读详情

相关推荐

《LabVIEW ZYNQ实战指南》第6章>>案例解析:基于USB WiFi模块的ZYNQ无线通信部署与Linux RT开发

本文详细解析了如何为ZYNQ开发板部署USB WiFi模块,实现无线通信。通过LabVIEW Linux RT环境,利用封装好的驱动VI,开发者可轻松配置ZYNQ连接无线网络,摆脱网线束缚,实现程序无线部署与远程调试,为工业物联网应用奠定基础。

app77的博客 755

Android-Service知识详解

service的使用 service的结构

H_xxxxd的博客 5100

Vivado Schematic视图实战:从RTL分析到布局布线,如何用它快速定位设计问题(附2019.1版操作)

本文深入解析Vivado Schematic视图在FPGA设计中的关键作用,从RTL分析到布局布线全流程,帮助工程师快速定位设计问题。通过三重视图对比、高效调试四步法和高级技巧,提升问题排查效率,缩短调试时间。文章结合2019.1版操作指南和实战案例,展示如何利用Schematic视图解决典型设计问题。

weixin_30591551的博客 488

关于Android Service真正的完全详解

Android Service完全详解

QG 3917

Rockchip平台Android相机HAL3开发实战:从配置到调试全流程解析

本文深入解析了Rockchip平台Android相机HAL3的开发全流程。从理解AAL与PSL核心架构、解析关键配置文件(如camera3_profiles.xml和Tuning文件),到搭建编译环境、进行增量部署,并提供了系统日志分析、V4L2调试等高级问题排查技巧,为开发者提供了一套从配置到调试的实战指南。

docker7nomad的博客 844

从零到一:基于Matlab的二阶系统时域性能指标计算与可视化实战

本文提供了一份基于Matlab的二阶系统时域性能指标计算与可视化实战指南。通过详细的代码示例,手把手教你如何利用Matlab计算超调量、调节时间等关键指标,并绘制阶跃响应曲线进行可视化分析,帮助控制工程学习者和从业者快速掌握系统性能评估方法。

weixin_29096377的博客 269

Android 服务(Service)详解

总结学习类文章 service(服务)是安卓中的四大组件之一,它通常用作在后台处理耗时的逻辑,与Activity一样,它存在自己的生命周期,也需要在AndroidManifest.xml配置相关信息。 服务(Service)是Android中实现程序后台运行的解决方案,它非常适合去执行那些不需要和用户交互而且还要求长期运行的任务。服务的运行不依赖于任何用户界面,即使程序被切换到后台,或者用户打开了另外一个应用程序,服务仍然能够保持正常运行。 不过需要注意的是,服务并不是运行在一个独立的进程当中的,而是依赖

weixin_40862356的博客 1万+

从零搭建医疗化验单识别系统:深度学习+OCR实战教程(附数据集)

本文详细介绍了如何从零开始构建一个医疗化验单智能识别系统。通过融合深度学习和OCR技术,系统能够应对版式多样、内容专业的医疗单据,实现从文本检测、识别到关键信息结构化抽取的全流程。文章提供了数据集处理、模型选型、训练微调及工程化部署的实战指南,并分享了避坑经验与性能优化策略,为开发者解决医疗信息化痛点提供了完整的技术方案。

k9l0m1的博客 492

Android入门教程 | 四大组件之Service(前台服务,后台服务)

Service是一种可在后台执行长时间运行操作而不提供界面的应用组件。服务可由其他应用组件启动,而且即使用户切换到其他应用,服务仍将在后台继续运行。此外,组件可通过绑定到服务与之进行交互,甚至是执行进程间通信 (IPC)。例如,服务可在后台处理网络事务、播放音乐,执行文件 I/O 或与内容提供程序进行交互。

Android23333的博客 6700

【WRF-Chem教程-附录 C】闪电-NOx 参数化方案详解

闪电-NOx 参数化方案详解

WW、forever的博客 974

基于MATLAB的PDT DMR物理层仿真

PDT DMR物理层仿真的目标是评估系统的误码率(Bit Error Rate,BER),以及验证和优化各种调制方案、编码方案和信道模型。下面将介绍如何进行PDT DMR物理层的仿真,并提供相应的MATLAB源代码。通过上述步骤,我们可以进行基于MATLAB的PDT DMR物理层仿真,并评估系统的性能。根据实际需求,我们可以修改仿真参数和添加更复杂的信道模型,以更全面地评估系统性能。最后,我们可以将仿真结果进行可视化和分析。首先,我们需要设置仿真的参数,包括调制方案、编码方案、信道模型和信噪比等。

TechPulseZ的博客 459

关于Android Service真正的完全详解,你需要知道的一切

转载:http://blog.youkuaiyun.com/javazejian/article/details/52709857 Service全部内容基本会在本篇涉及到,我们将围绕以下主要知识点进行分析: Service简单概述 Service在清单文件中的声明 Service启动服务实现方式及其详解 Service绑定服务的三种实现方式 关于启动服务与绑定服务间的转换问题 前台服务以及通知发送 服务Service与线程Thread的区别 管理服务生命周期的要点 Android 5.0以上的隐式启动问题及其解决

weixin_42602900的博客 5178

锂电池充放电管理-单片机通用模版

- **①两节锂电池通过电阻分压检测ADC,再根据电压划分电量等级;** - **②充电使用的是锂电池充电IC方案,可通过硬件电阻参数调节充电电流,并可以通过STAT引脚检测充电和满电状态(充电注意会抬高电压);** - **③放电根据ADC_BAT检测电池电量进行等级划分(注意大负载电压骤降瞬间);** - **④充放电过程注意在电量划分等级临界值来回抖动现象;**

a6662580的博客 1489

【Android】安卓四大组件之Service

【Android】安卓四大组件之Service 1、Service的介绍 1.1 什么是service Service即服务,用大白话讲就是——长期运行在后台的程序,如果我们说的官方一点,那么就是用于执行长期运行的任务,并且没有与用户交互的功能。 每一个service都和activity一样,需要在manifest.xml中配置,赋予其生命。使用<service>标签即可配置 在activity类中,可以使用Context.startService()方法来开启服务,使用Context.stop

woodwhale的博客 690

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

android四大组件(Activity,Service,BroadcastReceiver,Content Provider)

安卓的四大组建,五大布局Android四大组件:Activity、Service、Broadcast Receiver、Content Provider。1、 Activity 可以去本人博客activity了解学习是Android程序与用户交互的窗口,从视觉效果来看,一个Activity占据当前的窗口,响应所有窗口事件,具备有控件,菜单等界面元素。从内部逻辑来看,Activity需要为了保持各个

Mr_haimeng的博客 1358

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

【Android】安卓四大组件之服务(Service)详解:从基础到进阶

Service作为安卓应用后台任务处理的核心组件,在保障应用功能完整性和提升用户体验方面起着不可或缺的作用。通过掌握Service的生命周期、分类及使用场景,开发者能够合理设计应用架构,实现高效、稳定的后台任务处理。随着安卓系统的不断升级,Service的使用也需与时俱进,结合新特性和替代方案,让应用在后台运行中发挥更大价值。希望本文能帮助大家深入理解Service,在安卓开发中灵活运用这一强大工具

m0_59734531的博客 1522

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

【Android】安卓四大组件之Service用法

使用Handler更新UI,基本特点后台执行Service主要用于在后台执行一些长时间运行的操作,比如音乐播放、文件下载等,而不会影响用户界面的交互。

Patrick_yuxuan的博客 1401

Android四大组件之Service

https://developer.android.google.cn/guide/components/services.html本篇博客讲解的是Android四大组件之Service,下面是内容摘要: 了解Service Android 中的进程 电话窃听器 Service 的生命周期 AIDL的使用 一、Service 的基本概念Android 官方文档对Service 的解释如下:A Ser

JackChan 1176

安卓四大组件之service

Service作为Android四大组件之一,在每一个应用程序中都扮演着非常重要的角色,所以每一位安卓工程师对其掌握是必然的!针对Service,优快云博客之星–郭霖写了两篇比较完整的解析博客: Android Service完全解析,关于服务你所需知道的一切(上) Android Service完全解析,关于服务你所需知道的一切(下)

探路的淮--Ontheway的博客 953

android四大组件应用app,安卓四大组件———Service

1.什么是Service(服务)Service是一种后台运行的应用组件。2.Service有哪些应用场景下载任务,qq消息缓存,音乐播放器的播放3.startService方式启动Service怎么做()首先新建一个类继承Service ,实现它的onBind方法,其中可以用onCreate(),onStartCommand()和onDestroy()方法。例如package com.exampl...

weixin_30395941的博客 513

安卓开发四大组件及Service

对于activity和服务来说,它指明了请求的操作名称以及作为操作对象的数据的URI和其他一些信息。比方说,它能够承载对一个activity 的请求,让它为用户显示一张图片,或者让用户编辑一些文本。广播i接收器没有用户界面,但可以启动一个activity或service来响应收到的信息,或用NotificationManager来通知用户。静态注册无需担忧是否被关闭,只要设备是开启状态,广播接收器也是打开的。使用URI唯一标识其数据集,这里的URI以content://作为前缀,表示数据由其管理。

gfdr5的博客 297

安卓四大组件之Service

Service作为安卓四大组件之一通常用来完成一些不需要用户操作,但是一直运行着的任务  在介绍Service之前 我们先了解一下安卓中进程的优先级: 安卓中的优先级共有5个 1.Foregrounf process 前台进程  当前进程中有Activity处于可见可操作(Activity执行onResume之后) service 以及广播接收者 执行生命周期方法 2.vi

ybx007的博客 512

Android 四大组件之Service

Service是android系统中的四大组件之一(Activity、Service、BroadcastReceiver、ContentProvider),它跟Activity的级别差不多,区别是Service只能运行在后台不提供用户界面,并且可以和其他组件进行交互。一个Service是一个可以长期运行在后台的应用程序组件,不提供用户界面。 另一个应用程序组件可以启动一个服务,它将继续在后台运行,...

ZHS_Vistor的博客 474

Android——四大组件Service

文章目录AndroidAndroid四大组件——Service1 简介2 生命周期3 Service分类3.1 started(启动服务)3.2 bound(绑定服务)IBinder接口ServiceConnection接口 Android Android四大组件——Service service用于在后台完成用户指定的操作。 startService() 与 bindService()区别: (a)started service(启动服务)是由其他组件调用startService()方法启动的,这导致服

weixin_45044097的博客 300

安卓四大组件 —— Service

1、什么是service? service是android四大组件之一,是可以在后台长期执行并且没有用户界面的程序组件;只能运行在主线程中,不能做耗时操作,可以跨程序调用。 2、service有哪些应用场景? 当程序中的某项功能执行时间较长(如:下载,上传等)并且在执行过程中不需要用户操作,不需要Activity进行交互的情况下,可以通过service在后台完成指定任务。 3、starSe...

s15770702468的博客 728
上一篇: Android 四大组件之 Service (上)
下一篇: Android 多线程编程初探
QDJdeveloper
博客等级 码龄11年 108粉丝 49原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值