- 博客(21)
- 收藏
- 关注
原创 ObjectOutputStream的结构
成员变量 “serialVersionUID”;没有就用class的hash,跟method有关。成员变量的数量(非static,非transient)不是基本类型,则写入成员变量的类型。成员变量的类型的第一个字符。
2023-03-23 16:03:59 130
原创 android studio的git没有local changes
settings-> version control-> commit-> use non-modal commit interface // 取消这个勾选
2022-02-25 18:04:50 2757
原创 锁屏解锁-KeyguardManager
判断是否锁屏KM.isKeyguardLocked()是否锁屏。不管有没有设置密码KM.isDeviceLocked()手机锁屏,且需要密码才能解锁KM.isKeyguardSecure()如果锁屏,需要密码(比isDeviceSecure 多了个sim锁)才能解锁。此时也可以没锁屏KM.isDeviceSecure()如果锁屏,需要密码才能解锁。此时可以没锁屏。解锁KeyguardManager.KeyguardLock.disableKeyguard()描述:KeygaurdLo
2022-02-11 18:08:50 4389
原创 SharedPreference
原理创建创建sp文件的File对象class ContextImpl { SharedPreferences getSP(String name, int mode) { ... synchronzed (ContextImpl.class) { ... file = mSharedPrefsPaths.get(name); if (file == null) { file = getSHaredPreferencesPath(name); //就是计算出
2022-01-27 10:39:15 317
原创 CountDownLatch
使用构造时,指定一个int 门栓个数线程A 执行cdt.await(),线程A会park 挂起线程B 调用 cdt.coundDown(); 会打开一个门栓,直到门栓个数是0时,notify 所有park 的线程主要方法class CountDownLatch { public CountDownLatch(int count) {} public await() {} public coundDown() {}}原理AbstractQueuedSynchronizer实现
2022-01-26 19:00:11 133
原创 PendingIntent
创建调用封装好的接口创建PIPendingIntent pi = PendingIntent.getActivity(mContext, 0, new Intent("com.a.b"), 0);Notification n = new Notification.Builder() .setContentIntent(pi) .. .build();原理总结app 端会调用AMS 获取 PIRecordAMS 创建PIRecord 后,会自己保存一份,再返回给appapp中调用
2022-01-25 11:36:32 2194
原创 socket--java
server端创建ServerSocket对象 对应c++的: 1. 创建 serverSocket 2. 创建 serverSocketAddress 3. 把地址bind到serverSocket 4. listen(serverSocket, backlog) serverSocket = ServerSocket(int port, int backlog, InetAddress bindAddr);获取clientSocket 对应c++的: 1. clientS
2021-12-22 17:12:56 313
原创 socket-c++
C++中,linux服务端创建用于监听client的socket(int af, int type, int protocol)1. af:address family,指定ip类型,用的ipv4还是ipv62. type:socket类型,包括sock_stream、sock_dgram,也就对应着tcp 、udp3. protocol:传输协议用 tcp还是udp。如果type可以推算出protocol来,可以写默认值0。创建 sockaddr_in 结构体,用于指定监听server
2021-12-22 16:00:09 511
原创 m的n进制
整数java里,只有整数转换接口,没有小数Integer.toBinaryString(int); 小数含义十进制二进制0.50.11个苹果分10个0.1,0.5份有多少1个苹果分2份,0.1份有多少5/101/2计算方法乘2取整法:0.6 *2 = 1.2 – 0.1余0.20.2 * 2 = 0.4 – 0.100.4 * 2 = 0.8 – 0.1000.8 * 2 = 1.6 – 0.1001 余0.6…原理:二进制的小数:0
2021-12-18 15:28:25 459
原创 settings
原理通过 ContentProvider 和 ContentObserver实现的调用方式改值 void test() { Settings.Global.putString(contentResolver, name, value); }取值 void test() { Settings.Global.getString(contentResolver, name); }监听变化 void test() { contentResolver.registerContent
2021-12-17 15:41:15 1115
原创 wallpaper_md
设置壁纸void changeWallpaper(Bitmap targetBitmap) { WallpaperManager wallpaperManager = WallpaperManager.getInstance(context); wallpaperManager.setBitmap(targetBitmap);}wallpapermanager和 wallpaperManagerServiceWallpaperManager { static Wallp
2021-12-09 16:23:03 377
原创 GLSurfaceView
参考了:https://www.jianshu.com/p/369d5694c8ca使用Renderer,在GLSurfaceView里画。class MyGLSurfaceView extends GLSurfaceView { public MyGLSurfaceView(Context context, AttributeSet attrs) { super(context, attrs); setRenderer(new MyRender());
2021-12-09 15:27:50 2982
原创 surfaceView
如何显示surfaceView extends View,所以把它添加到ViewTree中。当ViewRootImpl开始performTraversals时,window可见时,会回调SurfaceView.onWindowVisibilityChanged(),进而执行updateSurface()。除了window可见,还有很多情况会回调updateSurface()。ViewRootImpl如何获取surfaceViewRootImpl中,surfaceControl是通过windowSe
2021-12-08 15:21:26 555
原创 ViewRootImpl
什么时机可以修改ViewRootImpl.mSurface? 在activity的onAttachToWindow.ViewRootImpl是怎么创建出来的?ActivityThread.handleResumeActivity,如果a.mVisibleFromClient(a是activity,mVisibleFromClient是通过activity.setVisible()设置的),则调用wm.addV
2021-12-08 14:25:14 286
原创 wallpaper
设置壁纸void changeWallpaper(Bitmap targetBitmap) { WallpaperManager wallpaperManager = WallpaperManager.getInstance(context); wallpaperManager.setBitmap(targetBitmap);}wallpapermanager和 wallpaperManagerServiceWallpaperManager { static W..
2021-12-02 09:27:28 630
原创 ContentProvider
App端进程创建后,执行ActivityThread.main(); 创建ActivityThread实例,并执行attach(); 通知AMS本进程创建完成了,AMS.attachApplication(mAppThread, startSeq);AMS的attachApplicationLock中,会找到这个app的providerAMS { attachApplicationLocked() { List<...
2021-11-29 16:29:14 123
原创 contentObserver
文字描述1,注册时,在ContentService中,uri的"/"将uri分成各个segment,每个segment创建一个ObserverNode。在与uri完全匹配的那个Node中,将ContentObserver保存进去。2,notifyChange时,uri会找到匹配的ObserverNode,然后取出这个Node中所有的ContentObserver,然后告诉这个ContentObserver。注册监听ContentResolver { registerCont
2021-11-29 15:27:54 1082
原创 虚拟机hybrid编译
是否开启 jit 编译开启adb rootadb shell stopadb shell setprop dalvik.vm.extra-opts -verbose:jitadb shell start关闭:adb rootadb shell stopadb shell setprop dalvik.vm.usejit falseadb shell start强制编译全编译某个apk:adb shell cmd package compile -m speed -..
2021-11-29 15:27:38 1479
原创 ValueAnimator运行原理
start()中,会调用addAnimationCallback(0); getAnimationHandler().addAnimationFrameCallback(this, delay); //getAnimationHandler()获取到的是AnimationHandler这个单例 getProvider().postFrameCallback(mFrameCallback); //单例中,第一次有动画开始,向Choreography中post一个 FrameCal
2021-11-29 15:26:46 133
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人