首页 文章 精选 留言 我的

精选列表

搜索[SpringBoot4],共10000篇文章
优秀的个人博客,低调大师

Android Service的思考(4

在android平台中,一个进程通常不能访问其他进程中的内存区域的。但是,我们可以使用IDL语言来把对象伪装成操作系统能理解的简单形式,以便伪装成对象跨越边界访问。 如果想在应用程序中调用其他进程中的Service,则需要用到AIDL,AIDL(android接口描述语言)是一种IDL语言,它可以生成一段代码,可以使在一个android设备上运行的两个进程使用内部通信进程进行交互。如果你需要在一个进程中(例如:在一个Activity中)访问另一个进程中(例如:一个Service)某个对象的方法,你就可以使用AIDL来生成这样的代码来伪装传递各种参数。 使用AIDL的方法如下: 1.首先生成一个IMusicService.aidl的服务接口,Android会自动生成一个 Stub类,这个类继承了BInder类,同时继承了IMusicService这个接口,还可以看到其中包含了一个Proxy代理类,以实现远程代理。(aidl和Stub类如下所示) ?[Copy to clipboard] Downloadzuiniuwang.java /** *IMusicService.aidl *com.androidtest.service.mediaplayer * *Function:TODO * *verdateauthor *────────────────────────────────── *2011-5-19Leon * *Copyright(c)2011,TNTAllRightsReserved. */ packagecom.androidtest.service.mediaplayer; /** *ClassName:IMusicService *Function:TODOADDFUNCTION *Reason:TODOADDREASON * *@authorLeon *@version *@sinceVer1.1 *@Date2011-5-19 */ interfaceIMusicService{ voidplay(); voidpause(); voidstop(); } /* *Thisfileisauto-generated.DONOTMODIFY. *Originalfile:D:\\Backup\\�ҵ��ĵ�\\Dropbox\\investment\\A8\\workspace\\androidtest\\src\\com\\androidtest\\service\\mediaplayer\\IMusicService.aidl */ packagecom.androidtest.service.mediaplayer; /** *ClassName:IMusicServiceFunction:TODOADDFUNCTIONReason:TODOADDREASON * *@authorLeon *@version *@sinceVer1.1 *@Date2011-5-19 */ publicinterfaceIMusicServiceextendsandroid.os.IInterface{ /**Local-sideIPCimplementationstubclass.*/ publicstaticabstractclassStubextendsandroid.os.Binderimplements com.androidtest.service.mediaplayer.IMusicService{ privatestaticfinaljava.lang.StringDESCRIPTOR="com.androidtest.service.mediaplayer.IMusicService"; /**Constructthestubatattachittotheinterface.*/ publicStub(){ this.attachInterface(this,DESCRIPTOR); } /** *CastanIBinderobjectintoan *com.androidtest.service.mediaplayer.IMusicServiceinterface, *generatingaproxyifneeded. */ publicstaticcom.androidtest.service.mediaplayer.IMusicServiceasInterface( android.os.IBinderobj){ if((obj==null)){ returnnull; } android.os.IInterfaceiin=(android.os.IInterface)obj .queryLocalInterface(DESCRIPTOR); if(((iin!=null)&&(iininstanceofcom.androidtest.service.mediaplayer.IMusicService))){ return((com.androidtest.service.mediaplayer.IMusicService)iin); } returnnewcom.androidtest.service.mediaplayer.IMusicService.Stub.Proxy( obj); } publicandroid.os.IBinderasBinder(){ returnthis; } @Override publicbooleanonTransact(intcode,android.os.Parceldata, android.os.Parcelreply,intflags) throwsandroid.os.RemoteException{ switch(code){ caseINTERFACE_TRANSACTION:{ reply.writeString(DESCRIPTOR); returntrue; } caseTRANSACTION_play:{ data.enforceInterface(DESCRIPTOR); this.play(); reply.writeNoException(); returntrue; } caseTRANSACTION_pause:{ data.enforceInterface(DESCRIPTOR); this.pause(); reply.writeNoException(); returntrue; } caseTRANSACTION_stop:{ data.enforceInterface(DESCRIPTOR); this.stop(); reply.writeNoException(); returntrue; } } returnsuper.onTransact(code,data,reply,flags); } privatestaticclassProxyimplements com.androidtest.service.mediaplayer.IMusicService{ privateandroid.os.IBindermRemote; Proxy(android.os.IBinderremote){ mRemote=remote; } publicandroid.os.IBinderasBinder(){ returnmRemote; } publicjava.lang.StringgetInterfaceDescriptor(){ returnDESCRIPTOR; } publicvoidplay()throwsandroid.os.RemoteException{ android.os.Parcel_data=android.os.Parcel.obtain(); android.os.Parcel_reply=android.os.Parcel.obtain(); try{ _data.writeInterfaceToken(DESCRIPTOR); mRemote.transact(Stub.TRANSACTION_play,_data,_reply,0); _reply.readException(); }finally{ _reply.recycle(); _data.recycle(); } } publicvoidpause()throwsandroid.os.RemoteException{ android.os.Parcel_data=android.os.Parcel.obtain(); android.os.Parcel_reply=android.os.Parcel.obtain(); try{ _data.writeInterfaceToken(DESCRIPTOR); mRemote.transact(Stub.TRANSACTION_pause,_data,_reply,0); _reply.readException(); }finally{ _reply.recycle(); _data.recycle(); } } publicvoidstop()throwsandroid.os.RemoteException{ android.os.Parcel_data=android.os.Parcel.obtain(); android.os.Parcel_reply=android.os.Parcel.obtain(); try{ _data.writeInterfaceToken(DESCRIPTOR); mRemote.transact(Stub.TRANSACTION_stop,_data,_reply,0); _reply.readException(); }finally{ _reply.recycle(); _data.recycle(); } } } staticfinalintTRANSACTION_play=(android.os.IBinder.FIRST_CALL_TRANSACTION+0); staticfinalintTRANSACTION_pause=(android.os.IBinder.FIRST_CALL_TRANSACTION+1); staticfinalintTRANSACTION_stop=(android.os.IBinder.FIRST_CALL_TRANSACTION+2); } publicvoidplay()throwsandroid.os.RemoteException; publicvoidpause()throwsandroid.os.RemoteException; publicvoidstop()throwsandroid.os.RemoteException; } 2. 在MyRemoteBinder需要继承这个Stub类,对播放器的控制写在这个Binder类中 ?[Copy to clipboard] Downloadzuiniuwang.java /** *MyRemoteBinder.java *com.androidtest.service.mediaplayer * *Function:TODO * *verdateauthor *────────────────────────────────── *2011-5-19Leon * *Copyright(c)2011,TNTAllRightsReserved. */ packagecom.androidtest.service.mediaplayer; importandroid.media.MediaPlayer; importandroid.os.Binder; importandroid.os.RemoteException; /** *ClassName:MyRemoteBinder *Function:TODOADDFUNCTION *Reason:TODOADDREASON * *@authorLeon *@version *@sinceVer1.1 *@Date2011-5-19 */ publicclassMyRemoteBinderextendsIMusicService.Stub{ publicMyRemoteBinder(MediaPlayermediaPlayer){ MyMediaController.mediaPlayer=mediaPlayer; }; @Override publicvoidplay()throwsRemoteException{ //TODOAuto-generatedmethodstub MyMediaController.play.execute(); } @Override publicvoidpause()throwsRemoteException{ //TODOAuto-generatedmethodstub MyMediaController.pause.execute(); } @Override publicvoidstop()throwsRemoteException{ //TODOAuto-generatedmethodstub MyMediaController.stop.execute(); }; } 3. 在Activity中得到Binder的方式,是通过Stub类的IMusicService.Stub.asInterface(binder)方法 ?[Copy to clipboard] Downloadzuiniuwang.java privateServiceConnectionmyServiceConnection=newServiceConnection(){ @Override publicvoidonServiceConnected(ComponentNamename,IBinderbinder){ musicServiceInterface=IMusicService.Stub.asInterface(binder); Log.d(TAG,"onServiceConnected"); } @Override publicvoidonServiceDisconnected(ComponentNamename){ musicServiceInterface=null; Log.d(TAG,"onServiceDisconnected"); } }; 本文转自 最牛傻蛋 51CTO博客,原文链接:http://blog.51cto.com/zuiniuwang/718309,如需转载请自行联系原作者

优秀的个人博客,低调大师

day4 Activity相关

什么是Activity? 与用户交互的接口,提供用户触摸,点击,滑动的界面。Android中的activity全都归属于task管理 。task 是多个 activity 的集合,这些 activity 按照启动顺序排队存入一个栈(即“back stack”)。android默认会为每个App维持一个task来存放该app的所有activity,task的默认name为该app的packagename。 四种状态? running 活动状态,也是activity处于栈顶的状态,这时用户触摸屏幕,activity会响应事件 paused activity失去焦点或者被比如对话框覆盖时的状态,这时activity只是失去焦点,所有的成员变量和状态都还在 stopped 被其它Activity完全覆盖 killed activity被销毁 Activity生命周期,常见类型概述 Activity生命周期 第一想到的是那副经典的生命周期图,怎么叙述呢。Activity可以理解为一个界面,为了便于界面编程,安卓设计者赋予了Activity生命周期的概念,从产生到消亡,我们开发者可以在生命周期的对应阶段做相应处理,那么怎么做处理呢?就是Activity每到一个生命周期的阶段,就会回调对应的一个方法,比如创建时回调onCreate()。然后我简单介绍下Activity的一个完整的生命周期是怎样的顺序: 首先创建时回调onCreate(),这里可以进行一些初始化操作,比如设置布局资源,然后onStart(),表明Acitivity正在启动,activity已处于可见状态,但是还没有处于前台显示的,就是用户还不能在此Activity进行交互。接着是onResume(),这个调用后会处于前台可见状态,用户可进行交互。 点击Home键回到主界面(Activity不可见),会让activity退居到后台,这时onPause()会被调用,一般情况下,onStop()会在onPause()执行后调用,这时候表明整个Activity被停止或被完全覆盖,因为这个时候activity是不可见得,完全处于后台运行,另外当调用onPause后,如果系统内存吃紧,activity是有可能被回收的。 当我们再次回到原Activity时,onRestart()会调用,表示这个Activity正在重新启动,从桌面回到APP,,onRestart()调用完后会调用onStart(),activity回到可见状态,和前面一样之后调用onResume,activity回到前台可见可交互状态。 退出当前Activity时->onPause() -> onStop() -> onDestroy(),onDestroy会在activity彻底销毁前调用 anroid 进程优先级 前台:处于前台和用户交互的activity或者和前台进程Activity绑定的Service所处的进程 可见:处于可见,但不处于前台,用户不可以交互的进程 服务:后台开启的Service服务 后台:点击了Home,前台进程变为后天进程 空 activity被回收的状态和信息保存和恢复过程 onSaveInstanceState方法在Activity可能被回收之前调用,用来保存自己的状态和信息,以便回收后重建时恢复数据(在onCreate()或onRestoreInstanceState()中恢复),旋转屏幕重建Activity会调用此方法,而且要调用的话就一定发生在onStop方法之前,但并不保证发生在onPause的前面还是后面。onRestoreInstanceState方法这个方法在onStart 和 onPostCreate之间调用,在onCreate中也可以状态恢复,但有时候需要所有布局初始化完成后再恢复状态。 Activity的启动模式,每个启动模式的不同点是什么? 启动模式简单的说就是定义Activity实例与tack的关联方式 为什么定义启动模式: 让某些Activity启动一个新的task 让activity复用,而不是重新创建一个实例 定义方式: 使用manitest文件,通过Activity的 android:launchMode="standard"属性 intent设置:靠Flag FLAG_ACTIVITY_NEW_TASK:指定为singleTask模式 FLAG_ACTIVITY_SINGLE_TOP:指定为singleTop模式 FLAG_ACTIVITY_CLEAR_TOP:标识此Activity,当它启动时,在同一个任务栈中位于它上面的Activity都要出栈 FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS:标识此Activity不会出现在历史Activity的列表中 哪些启动模式: standard 标准模式:总会为activity创建一个新的实例,并将该实例添加到当前task中,这种方式不会启动新的Task,只是将新的 Activity添加到原有的Task中。 singleTop:栈顶复用模式,这种模式下,如果新Activity已经位于任务栈的栈顶,那么此Activity不会被重新创建,同时他的onNewIntent方法会被回调。 singleTask:栈内复用模式 singleInstance:单实例模式,此种模式的Activity只能单独的位于一个任务栈中 如何在非活动Activity内存不足时被系统销毁前保存数据? Activity中提供了一个方法:onSavedInstanceState(Bundle obj).当系统销毁一个Activity时,会将Activity的状态信息已键值对形式存放在bundle对象中. 第一次启动Activity时,这个bundle对象是空的,null.如果Activity被系统销毁了,然后用户要回退回去看的话,系统会调用这个Activity的onCreate方法,并把bundle对象传递过去. 横竖屏切换时,Activity的生命周期会有那些变化? 1、不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次 2、设置Activity的android:configChanges=”orientation”时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次 3、设置Activity的android:configChanges=”orientation|keyboardHidden”时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法 Activity如何设置为Dialog样式? 在AndroidManifest.xml 中定义Activity的地方一句话android:theme=”@android:style/Theme.Dialog”或android:theme=”@android:style/Theme.Translucent”就变成半透明的,也可以在onCreate代码中设置主题。 Context,Application,Activity的区别与联系? Context:提供应用环境全局信息的接口,并且这个接口是由抽象类实现的,它的执行被android系统所提供,允许我们获取以应用为特征的资源和类型,同时启动应用级的操作,如启动Activity,broadcasting和接收intent。 Application-Context的生命周期与Application的生命周期相关,context随着Application的销毁而销毁,伴随application的一生,与Activity的生面周期无关。 Activity-Context:这个Context的生命周期是和得到它的引用的Activity一样长,如果这个Activity结束了,那么,这个Context也会得到释放 使用context的时候,要小心内存泄漏,防止内存泄漏 不要让生命周期长的对象引用Activity context,即保证引用activity的对象要与activity本身生命周期是一样的 对于生命周期长的对象,可以使用Application-context 避免非静态的内部类,尽量使用静态类,避免生命周期问题,注意内部类对外部类对象引用导致的生命周期的变化。 Activity之间进行数据传递的方式有哪些? intent传递数据 先把数据保存到本地,然后在下一个Activity中从本地获取,存储方式可以是四种持久化存储方式:SharePreferences,SQlite,Content Provider和File 使用EventBus类似的事件总线 使用广播 如何退出Activity?如何安全退出已调用多个Activity的Application? 记录打开的Activity:每打开一个Activity,就记录下来,在需要退出时,关闭每一个Activity,Activity记录可在自定义的Application执行,Application可实现一个接口,该接口会返回相应启动或销毁的Activity实例 在需要结束应用时,发送一个特定的广播,每一个Activity收到广播后关闭 通过intent的flag来实现,根据应用界面的交互场景利用Activity的启动模式来设计。

优秀的个人博客,低调大师

SOFABoot 4.5.0 发布,蚂蚁开源的基于 Springboot 的服务框架

SOFABoot 是蚂蚁金服开源的基于 Spring Boot 的研发框架,它在 Spring Boot 的基础上,提供了诸如 Readiness Check,类隔离,日志空间隔离等等能力。在增强了 Spring Boot 的同时,SOFABoot 提供了让用户可以在 Spring Boot 中非常方便地使用 SOFA 中间件的能力。 SOFABoot 4.5.0现已发布,具体更新内容包括: 新功能 当组件注册失败时Fast Fail#1374 支持 spring boot 3.5.3#1379 将 OSSRH 更改为Central Portal#1382 错误修复 修复 StandardSofaRuntimeManager 内存泄漏#1373 更改 Maven 用户名和密码的操作#1386 Replenish module name#1388 依赖项升级 将 rpc 版本升级到 5.13.4,将 tracer 版本升级到 4.0.2#1367 将 staging plugin 版本升级到 1.7.0#1381 更新说明:https://github.com/sofastack/sofa-boot/releases/tag/v4.5.0

优秀的个人博客,低调大师

SOFABoot 4.4.1 发布,蚂蚁开源的基于 Springboot 的服务框架

SOFABoot 是蚂蚁金服开源的基于 Spring Boot 的研发框架,它在 Spring Boot 的基础上,提供了诸如 Readiness Check,类隔离,日志空间隔离等等能力。在增强了 Spring Boot 的同时,SOFABoot 提供了让用户可以在 Spring Boot 中非常方便地使用 SOFA 中间件的能力。 SOFABoot 4.4.1现已发布,具体更新内容包括: 新功能 支持 sbom endpoint#1352 错误修复 修复了并行调用多个实例 Bean 时 annotationWrapper 导致的线程安全问题#1354 修复导出模块名称#1357 依赖项升级 将 rpc 所有版本升级到 5.13.2#1356 升级 spring boot 版本到 3.3.7#1358 更新说明:https://github.com/sofastack/sofa-boot/releases/tag/v4.4.1

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册