Android跨进程通信Client Crash后Server端onDestroy

Android真实系统架构:从Linux内核到Framework的三层绞杀结构 Android并非教科书定义的标准化操作系统,而是一个以Linux内核为基底、经深度裁剪与定制的移动工程生态。其核心原理在于三层紧耦合架构:底层是被阉割又强扩展的Linux内核(含LMK内存管理、wakelock电源机制与Binder IPC);中层是芯片厂商主导的HAL与Vendor Interface,充满私有扩展与兼容性暗坑;上层则是Java Framework与Native Runtime持续博弈的‘拔河现场’。这种架构赋予Android极强硬件适配能力与商业灵活性,但也导致功耗差异、OTA升级复杂 阅读详情

hi,粉丝朋友大家好!
好久没有给大家写blog了,哈哈,这里说声抱歉!实在家里比较忙,今天就来给大家分享一个跨进程专题课中学员问的一个问题,blog就来解答一下这个问题。
问题背景:
视频课程内容链接:https://ke.qq.com/course/package/51285?tuin=7d4eb354
binder跨进程专题的,binder的linktodeath相关

在这里插入图片描述
这里同学提出疑问:

1、为啥这个跨进程通信时候client端crash了居然会导致server端的Service执行onDestroy? 2、而且为什么onDestroy了进程还在?

其实这个同学相对还是看视频非常专心的,注意到了这个细节。
这里其实要分析出这个问题并不难,我们首先可以来回答相对好回到的问题2:

为什么onDestroy了进程还在?

这个其实就是很多同学容易犯的一个错误,就是认为Activity执行onDestroy了就说明进程退出了,进程也会死了。其实不是哈,onDstroy只是属于进程里面的一个组件的生命周期完毕,大家注意哈,这里说的一个组件而不是进程的生命周期,即进程不会因为组件的onDestroy而进程也died,所以这里大家要注意哈

接下来在分析第一个问题

为啥这个跨进程通信时候client端crash了居然会导致server端的Service执行onDestroy?

总结一下就是为啥客户端死了会导致Service组件执行onDestroy,其实要想通这个问题并不难,首先从宏观上来看:
客户端 —bindService—才启动的Serivce执行的onCreate和onBind,但是现在客户端死了,那么大家想想那这个Serivce组件是不也应该要unbind和onDestroy呢?是不是这样想也其实挺合理
但是这个只是宏观上的一个理解感觉这样设计合理,但是请问老师你是嘴巴说么,有没有证据证明你说的这个,其实就是那句程序员名言:
talk is cheap,show me the code!
哈哈,那接下来就看我是show the code

分析步骤:
1、服务端service的onDestroy执行是谁调用过来的?
这个比较简单其实就使用课程经常使用的普通打印堆栈就可以

022-07-23 00:18:10.333 22650-22650/com.example.servicedemo I/test1: MyService onDestroy
    java.lang.Exception
        at com.example.servicedemo.MyService.onDestroy(MyService.java:126)
        at android.app.ActivityThread.handleStopService(ActivityThread.java:4669)
        at android.app.ActivityThread.access$2100(ActivityThread.java:247)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2096)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loopOnce(Looper.java:201)
        at android.os.Looper.loop(Looper.java:288)
        at android.app.ActivityThread.main(ActivityThread.java:7839)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)

大家发现这里其实是ActivityThread.handleStopService,这里其实大家大概知道,它对应的其实是:

   public final void scheduleStopService(IBinder token) {
            sendMessage(H.STOP_SERVICE, token);
        }

scheduleStopService这个方法调用导致,而scheduleStopService其实属于systemserver跨进程通信调用过来的
那么接下来就应该去framework中去搜索一下谁调用了scheduleStopService

test@test:~/aosp/frameworks$ grep scheduleStopService ./ -rn
./base/boot/hiddenapi/hiddenapi-max-target-o.txt:1933:Landroid/app/ActivityThread$ApplicationThread;->scheduleStopService(Landroid/os/IBinder;)V
./base/boot/hiddenapi/hiddenapi-max-target-o.txt:6200:Landroid/app/IApplicationThread$Stub$Proxy;->scheduleStopService(Landroid/os/IBinder;)V
./base/boot/hiddenapi/hiddenapi-max-target-o.txt:6254:Landroid/app/IApplicationThread$Stub;->TRANSACTION_scheduleStopService:I
./base/boot/boot-image-profile.txt:862:HSPLandroid/app/ActivityThread$ApplicationThread;->scheduleStopService(Landroid/os/IBinder;)V+]Landroid/app/ActivityThread;Landroid/app/ActivityThread;
./base/services/core/java/com/android/server/am/ActiveServices.java:4303:                    r.app.getThread().scheduleStopService(r);
./base/config/boot-image-profile.txt:862:HSPLandroid/app/ActivityThread$ApplicationThread;->scheduleStopService(Landroid/os/IBinder;)V+]Landroid/app/ActivityThread;Landroid/app/ActivityThread;
./base/core/java/android/app/ActivityThread.java:1085:        public final void scheduleStopService(IBinder token) {
./base/core/java/android/app/IApplicationThread.aidl:73:    void scheduleStopService(IBinder token);
./base/core/tests/coretests/src/android/app/servertransaction/TransactionParcelTests.java:445:        public void scheduleStopService(IBinder iBinder) throws RemoteException {

大家可以看出结果其实非常明确就是
./base/services/core/java/com/android/server/am/ActiveServices.java:4303: r.app.getThread().scheduleStopService®;
即ActiveServices中进行了调用的,所以我们就好办,要么打印堆栈也可以,或者大家直接我经常交大家的采用更加先进的debug systemserver也可以
这里我们采用debug方式:
在这里插入图片描述

具体是怎么调用的大家可以看一下堆栈然后自己跟一下就可以

大概意思就是:
systemserver其实也对client的binder对象进行了linkToDeath,当client crash 时候systemserver也是要对这个进程Application修改记录信息进行扫尾处理,cleanup的,这里面就包含了我们今天问题Service执行onDestroy,因为Serivce本身是由Client发起的绑定拉起,

*## 而且也没有其他客户端绑定Service了 *

,当然唯一的链条Client如果已经died了,那么Service也就没有再存在,执行对应的unbind和onDestroy

新课程优惠获取请加入qq群:422901085(获取demo源码)

android9.0以上当切换程序后,service在后台运行一分钟左右就自动停止的解决方案 service作为安卓四大组件之一,在开发项目中很多人都会用到,不知道大家有没有发现,在android9.0以上的系统,如果你在app启动了一个service,当你切换到另一个app时,在之前的安卓系统service还是会在运行的,但是当升级到android9.0的系统,你会发现,service在后台运行一分钟左右就会自动停止了,下面来给大家介绍一下如何使service一直在后台运行: 首先我们来了解一下官方文档上android9.0默认关掉后台运行的service的原因: 1、在后台运行应用会消耗设备 阅读详情

相关推荐

Android开发学习链路和教程规划

这是一套系统化的Android开发教程,采用全新链路式教学法,从Linux内核到应用上线全流程解析。教程特色在于每个知识点都涵盖底层原理、源码链路、使用方法和工程治理四大维度,确保开发者获得完整认知体系。课程分为三个阶段:底层运行环境(Linux内核、Binder、Zygote等)、项目构建与运行时(Gradle、APK安装、资源系统等)、四大组件与UI开发(Activity、View、Jetpack等)。

9年Android老兵,专注车载系统与移动架构。深耕Java/Kotlin,玩转Lua/Python。擅长百度/高德地图深度定制,分享拒绝浅尝辄止的硬核干货。 66

Android进阶之深入理解Service

1 介绍   Service是android的一种机制。Service是运行在后台的代码,不能与用户交互,可以运行在自己的进程,也可以运行在其他应用程序的上下文里。需要通过某一个Activity或其他Context对象来调用。 1.1 Service的生命周期   被启动的服务的生命周期:如果一个Service被某个Activity调用 Context.startService方法...

chenliguan的博客 812

2026年ComfyUI一键部署指南:秋叶整合包安装与API批量任务实战

节点式工作流是AI图像生成领域实现高度定制化和流程自动化的核心技术范式。其原理在于将图像生成的各个步骤(如提示词编码、模型加载、采样解码等)模块化为可连接、可配置的独立节点,用户通过可视化连线构建专属生成管线。这种架构的技术价值在于突破了固定界面的限制,提供了极致的灵活性与可重复性,尤其适合复杂工作流编排和批量生产任务。在应用场景上,它广泛应用于需要精细控制生成过程的研究、定制化内容创作以及自动化图像生成流水线。本文聚焦于ComfyUI这一代表性工具,详细解析如何通过秋叶整合包实现快速本地部署,并深入演示其

weixin_29056781的博客 542

Android基础--Service应用

Android中有四大组件,Service是其中的一个。 Service的特点:  1、第一次开启服务时,会创建一个服务对象:oncreate,开启服务会调用onstartCommand;  2、停止服务时调用ondestroy方法;  3、服务只能被创建一次,可以多次开启,每次开启时都会调用onstartCommand方法;  4、服务只能停止一次,如果多次停止不会执行任何操作; 服务的生命

Langxingtianxi的专栏 765

微信DAT图片恢复全攻略:从文件定位到批量解密(附最新路径变化)

本文提供了一份详尽的微信DAT图片恢复指南,涵盖新旧版本文件路径变化解析、DAT文件定位方法以及批量解密操作步骤。针对微信图片加密存储为DAT格式的痛点,文章介绍了高效易用的图形化解密工具,帮助用户将加密文件快速还原为JPG、PNG等可查看格式,并强调了数据安全与隐私保护的重要性。

p4q5r6s7t的博客 744

SAP CO-PA获利分析避坑指南:从数据采集到报表设计的5个关键步骤

本文深入解析了SAP CO-PA获利分析模块从数据采集到报表设计的完整流程。文章重点剖析了数据源头、特征派生、获利段设计等关键步骤,并对比了基于账户与基于成本核算两种模式的差异,特别强调了在S/4HANA时代的选择与常见陷阱,旨在帮助企业构建可靠、可执行的盈利分析体系。

flink9streamer的博客 826

【Android】App锁屏或者切到后台,调起服务;切换到前台,终止服务(针对声网聊天室声音采集问题处理)

一、应用场景 1、语音直播、聊天室类的App,Android 9 设备,应用锁屏或切后台后一分钟内音频采集无效。 从 Android 官网来看,这是系统强制限制。原文如下: Limited access to sensors in background Android 9 limits the ability for background apps to access user input an...

明天你好-博客 2976

骁龙X Elite笔记本重装Windows 11 Arm64系统完整指南与避坑手册

UEFI安全启动和Arm64架构是理解现代计算设备系统部署的基础。UEFI取代传统BIOS,提供了更安全的启动环境和模块化固件接口,而Arm64架构则以其高能效特性,在移动和新兴PC领域日益重要。其技术价值在于为设备带来更快的启动速度、更强的安全防护以及更优的功耗表现。在应用场景上,这直接关系到搭载高通骁龙X Elite等Arm处理器的笔记本电脑的系统安装与维护。对于这类设备,重装系统远非插入通用安装盘那么简单,核心挑战在于必须使用专为Arm64编译的Windows镜像,并需提前集成芯片组、网络等硬件的专属

weixin_33428613的博客 484

Android Framework从入门到精通:核心机制与实战路径全解析

在Android系统架构中,Framework层是连接应用与硬件的关键桥梁,也是决定系统性能、稳定性与扩展能力的技术核心。它通过Binder机制实现高效的跨进程通信,由AMS、WMS、PMS等系统服务协同管理组件生命周期、窗口布局与权限校验,同时借助SurfaceFlinger完成图形合成与渲染。理解这些底层原理,能够帮助开发者精准定位应用启动慢、卡顿掉帧、权限异常等疑难问题。无论是进行系统级定制、性能优化还是兼容性适配,掌握Framework的核心脉络都至关重要。本文以一线工程师的视角,梳理了从源码获取、

weixin_34034261的博客 346

wireshark抓包分析TCP协议和用Fiddler抓包Https分析

wireshark抓包分析TCP协议和用Fiddler抓包Https分析 1.实验说明: 以某种游戏的客户端连接服务器、断开服务器为例,用wireshark抓包分析TCP协议的三次握手连接、四次握手断开,与计算机网络原理进行验证;用Fiddler抓包,分析验证一个HTTPS网站的TCP连接过程 2.实验过程: wireshark实验: (1)实验准备:安装《洛克王国》游戏客户端, 运行洛克王国客户端,打开内存资源管理器查看PID 根据PID查看洛克王国服务端的IP地址和端口号 并打开命令行运行以下命令: n

qq_42032327的博客 1260

从投影到抗噪:直线拟合三大算法实战指南

本文深入解析了直线拟合的三大核心算法:常规最小二乘法(OLS)、正交回归(TLS)和RANSAC。通过对比其几何原理、代码实现与适用场景,为计算机视觉和数据分析领域的实践者提供了清晰的选型指南,帮助在抗噪、旋转不变性等不同需求下,精准选择并应用最合适的算法。

ujm567890的博客 576

爱奇艺Android秋招笔试题复盘:从Handler到Binder核心考点解析

在Android开发中,Handler消息机制与Binder进程通信是构建稳定应用的技术基石,也是大厂笔试和面试的高频考点。Handler通过Looper和MessageQueue实现线程间消息流转,其epoll机制和内存泄漏问题则考验开发者对源码的理解深度;而Binder凭借mmap映射实现一次拷贝,在性能、安全性和稳定性上优于传统IPC方案。这些底层原理直接关联到Activity启动模式、ContentProvider跨进程访问、线程池参数配置以及性能优化等实际场景。爱奇艺2019秋招Android方向

weixin_33853794的博客 296

【UE5】虚幻引擎Gameplay框架

游戏实例(UGameInstance)会在引擎启动时实例化,并保持活跃直至引擎关闭。这是一种管理器类,在游戏中不存在实体,但会追踪数据和运行代码。在联网多人游戏中,游戏实例不会被复制,而是独立存在于服务器以及所有互联的客户端上。所有你希望在关卡加载间保持的内容都应存于游戏实例中。例如,游戏实例是管理游戏保存系统的到地方。游戏实例还可以充当任意数量的 游戏实例子系统 的管理器,这些子系统由游戏实例创建和销毁,并且与游戏实例本身具有相同的生命周期。在线子系统就属于这类子系统。

一个写程序的 1795

Android-Service端和Clinet端通讯-如果client被杀了

最近做了一个android的语音项目,service端集成了语音服务,该service提供相关的语音SDK,比如语音搜索音乐,然后音乐app service集成这个SDK,从而获得语音能力。 在实际开发的过程中遇到两个棘手的问题: 1 Voice Service起来了,如果Music并没有启动,有人请求语音搜索音乐,那么怎么能告诉你呢? 2 如果Music起来并且通过bind接口绑定了Voice,那么voice如何知道呢? 针对两个问题我们进行分析: 1 Voice Service起来而M..

HellDevil的专栏 755

NVIDIA A100驱动及CUDA安装指南

NVIDIA A100驱动及CUDA安装指南:详细介绍了在Ubuntu系统下安装A100显卡驱动和CUDA工具包的完整流程,包括环境准备、驱动安装、CUDA配置及性能优化建议。特别推荐猿界算力平台提供开箱即用的A100算力租赁服务,具备专业团队支持、灵活租期和实惠价格等优势。文末通过PyTorch测试验证了A100设备的可用性,展示了80GB显存的强大计算能力。

2401_89353317的博客 1511

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Android 跨进程通信-(三)Binder机制之Client

前言 通过源码的角度来看下到底Binder机制是一个什么东西。如果不喜欢看源码,可以直接看每个章节的小结。 一 ServiceManager 在前面一篇Android 跨进程通信-(一)Binder概念引入中也总结过:Android在系统启动的时候,用户空间启动的第一个进程是init进程,在init进程中会启动Zygote进程,在Zygote进程会fork出SystemServer进程,也就是执行SystemServer的main函数,该文件位于framework/base/services/java

nihaomabmt的专栏 1330

深度学习工具包 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")

利用Andriod死亡通知机制告诉service,client被kill了

Android提供了一种叫做死亡通知的机制,用于满足某些应用的特定需求:     某个process需要知道另外一个process是否存活;或者当某个进程被kill的时候,另外一个进程期望知道这件事情;    一般来讲是某个bound service关心其client是否被kill   可能有人会问,为什么service会关系client是否被kill呢 应用场景:  比

fred专栏 1万+

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

【IPC通信】Server如何知道Client崩溃

我们知道,Android是Google基于linux开发的操作系统,沙盒机制的存在使运行在用户空间的各应用程序之间无法直接感知对方并访问对方进程空间,以保护各app敏感数据和文件不受影响。而各进程之间常需要进行数据通信。所以Android提供了Binder机制来解决通常的进程间通信的问题。Binder驱动运行在内核空间,拥有更高的权限,来充当进程间的信使来传递数据有天然优势,它通过代理对象的方式在...

乌啼夜的酒痕 1426

android service什么时候销毁,阳光沙滩-android 通过AppWidgetProvider 启动的Service会自动销毁问题...

想写一个根据电量来切换图片的AppWidget,由于监视电量需要另起一个service,我的想法是在添加第一个widget时启动service,在删除最后一个时结束service。layoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"&gt...

weixin_39685392的博客 638

Android Service完全解析,关于服务你所需知道的一切(上)(笔记)

Android.util.Log常用的方法有以下5个:Log.v() ,Log.d() ,Log.i() ,Log.w() ,Log.e() 。按照日志级别从高到低为ERROR, WARN, INFO, DEBUG, VERBOSE.至于日志级别本身的含义.1.下面是对各种日志级别的输出介绍: 1、Log.v 的输出颜色为黑色的,输出大于或等于VERBOSE日志级别的信息 2、Log.d的输出颜色是

fendouwangzi的专栏 1020

“对使用非SDK接口的限制”的适配实战

概述 首先需要说明的是,“对使用非SDK接口的限制”是针对所有应用的。此限制是从9.0(28)开始引入的,只要是运行在9.0及以上系统的app都会有此限制,无论app适配的targetSDKVersion是多少。 9.0、 1.0、 1.1版本对非SDK接口的限制是越来越严格。下面是官方文挡,说的很详细。 9.0非SDK接口 Android 10 中有关限制非 SDK 接口的更新 Android 11 中有关限制非 SDK 接口的更新 针对非 SDK 接口的限制 有条件屏蔽 (greylist-max-x)

“点点”专栏 1574

Android-Service的生命周期

与Activity类似,Service也有自己的生命周期函数,在不同的时刻,系统会调用对应的Service生命周期函数,不过与Activity声明周期相比,Service的声明周期更加简单,我们通过官方给出的一张图片来体会一下: Service 作为 Android四大组件之一,应用非常广泛。和Activity一样,Service 也有一系列的生命周期回调函数,我们可以用来监测 Service状态变化,并且在适当的时候执行适当的工作。 1、生命周期状态 生命周期方法说明: onCreate() :

qq_43401941的博客 1万+

android 服务 结束,android – onDestroy被调用但服务没有结束

我正在阅读“开始Android 4开发”一书,我正在使用按钮中的以下功能来控制服务:public void startService(View view) {startService(new Intent(getBaseContext(), QOLService.class));}public void stopService(View view) {stopService(new Intent(...

weixin_39581739的博客 695

android如何让service不被杀死

参考链接:http://www.eoeandroid.com/thread-120983-1-1.html 注:本文不代表个人观点,仅是网上搜集的资料,在此做个笔记。 1.在service中重写下面的方法,这个方法有三个返回值, START_STICKY是service被kill掉后自动重写创建 @Override     public int onStartCommand(Inten

Aria_zuo的专栏 2117

android AIDL的使用

在Android中,一个进程通常无法访问另一个进程的内存。为了进程间的通信,进程需要将其对象分解成可供操作系统理解的语言,将其编组为可更操作的对象,编写执行该编组操作的代码较为繁琐,因此Android会使用AIDL为我们处理此问题。

weixin_36965072的博客 371
上一篇: 手把手教你aosp android 12 pixel 解锁oem 编译刷入大全
下一篇: android 12 framework开发第53节-Activity的reLaunch及onConfigurationChanged android源码分析
千里马学框架
博客等级 码龄6年 1万+粉丝 650原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

千里马学框架

帮助你了,就请我喝杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值