使用反射设置壁纸,

//        wallpaperManager.setWallpaperComponent(new ComponentName(context.getPackageName(), name));

如果需要设置壁纸跟随移动需要设置

//        wallpaperManager.setWallpaperOffsetSteps(0.5f, 0.0f);
//        wallpaperManager.setWallpaperOffsets(windowToken, 0.5f, 0.0f);

    /*** 通过反射设置动态壁纸** @param context* @param name*/private void setLiveWallpaper(Context context, String name) {try {Class<?> aClass = Class.forName(WallpaperManager.class.getName());Method setWallpaperComponent = aClass.getMethod("setWallpaperComponent", new Class[]{ComponentName.class});boolean susccess = (boolean) setWallpaperComponent.invoke(WallpaperManager.getInstance(context), new ComponentName(context.getPackageName(), name));Log.d(TAG, "setLiveWallpaper: " + susccess);} catch (ClassNotFoundException e) {Log.d(TAG, "ClassNotFoundException: " + e.toString());e.printStackTrace();} catch (NoSuchMethodException e) {Log.d(TAG, "NoSuchMethodException: " + e.toString());e.printStackTrace();} catch (IllegalAccessException e) {Log.d(TAG, "IllegalAccessException: " + e.toString());e.printStackTrace();} catch (InvocationTargetException e) {Log.d(TAG, "InvocationTargetException: " + e.toString());e.printStackTrace();}
//        wallpaperManager.setWallpaperComponent(new ComponentName(context.getPackageName(), name));
//        wallpaperManager.setWallpaperOffsetSteps(0.5f, 0.0f);
//        wallpaperManager.setWallpaperOffsets(windowToken, 0.5f, 0.0f);}

使用方法:

changePaper(context, GifWallpaperService.class.getCanonicalName());

GIF和video壁纸加载器参考下面:

package com.xbh.viewsonic.display.wallpaper.helper;import android.content.Intent;
import android.content.ServiceConnection;
import android.graphics.Canvas;
import android.graphics.Movie;
import android.os.Handler;
import android.service.wallpaper.WallpaperService;
import android.util.Log;
import android.view.MotionEvent;
import android.view.SurfaceHolder;import com.blankj.utilcode.util.SPUtils;
import com.blankj.utilcode.util.ScreenUtils;
import com.xbh.viewsonic.util.LogUtil;import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;/*** Created by Tyhj on 2017/5/23.*/public class GifWallpaperService extends WallpaperService {private static final String TAG = "GifWallpaperService";public static String GIT_WALLPAPER = "git_wallpaper";private final Handler mHandler = new Handler();private Movie movie;private float scaleWidth, scaleHeight;public static ServiceConnection connection;@Overridepublic void onCreate() {super.onCreate();LogUtil.i(TAG, "onCreate");}@Overridepublic boolean bindService(Intent service, ServiceConnection conn, int flags) {Log.d(TAG, "bindService: ");connection = conn;return super.bindService(service, conn, flags);}@Overridepublic void onRebind(Intent intent) {super.onRebind(intent);Log.d(TAG, "onRebind: ");}private void initGif() {InputStream stream = null;try {String string = SPUtils.getInstance().getString(GIT_WALLPAPER, "wallpaper_001.gif");/*是否是外部资源文件* 1、assets文件* 2、从外部拷贝到cache目录文件*/if (string.contains(File.separator)) {stream = new FileInputStream(string);} else {stream = getAssets().open(string);}} catch (IOException e) {e.printStackTrace();LogUtil.e(TAG, "initGif error:" + e.toString());}movie = Movie.decodeStream(stream);//获取gif的宽高int width = movie.width();int height = movie.height();// 设置想要的大小int newWidth = ScreenUtils.getScreenWidth();int newHeight = ScreenUtils.getScreenHeight();LogUtil.i("宽度:", newWidth + "");LogUtil.i("长度:", newHeight + "");// 计算缩放比例scaleWidth = ((float) newWidth) / width;scaleHeight = ((float) newHeight) / height;scaleWidth = (scaleWidth > scaleHeight) ? scaleWidth : scaleHeight;}@Overridepublic Engine onCreateEngine() {Log.d(TAG, "onCreateEngine: ");return new Mngine();}//Engine是WallpaperService中的一个内部类,实现了壁纸窗口的创建以及Surface的维护工作class Mngine extends Engine {//线程private Runnable runnable = new Runnable() {@Overridepublic void run() {drawFrame();}};private void drawFrame() {if (movie == null) {initGif();}Canvas canvas = null;canvas = getSurfaceHolder().lockCanvas();canvas.scale(scaleWidth, scaleWidth);canvas.save();//绘制此gif的某一帧,并刷新本身movie.draw(canvas, 0, 0);movie.setTime((int) (System.currentTimeMillis() % movie.duration()));canvas.restore();//结束锁定画图,并提交改变,画画完成(解锁)getSurfaceHolder().unlockCanvasAndPost(canvas);mHandler.postDelayed(runnable, 50);   //50ms表示每50ms绘制一帧}@Overridepublic void onCreate(SurfaceHolder surfaceHolder) {super.onCreate(surfaceHolder);setTouchEventsEnabled(true);initGif();LogUtil.i(TAG, "Engine onCreate");}public Mngine() {}@Overridepublic void onSurfaceCreated(SurfaceHolder holder) {super.onSurfaceCreated(holder);drawFrame();LogUtil.i(TAG, "onSurfaceCreated");}@Overridepublic void onDestroy() {super.onDestroy();mHandler.removeCallbacks(runnable);movie = null;LogUtil.i(TAG, "onDestroy");}@Overridepublic void onVisibilityChanged(boolean visible) {LogUtil.i(TAG, "onVisibilityChanged:" + visible);/*下面这个判断好玩,就是说,如果屏幕壁纸状态转为显式时重新绘制壁纸,否则黑屏幕,隐藏就可以*/if (visible) {drawFrame();} else {mHandler.removeCallbacks(runnable);}}@Overridepublic void onTouchEvent(MotionEvent event) {}@Overridepublic void onSurfaceChanged(SurfaceHolder holder, int format, int width, int height) {LogUtil.i(TAG, "onSurfaceChanged");drawFrame();super.onSurfaceChanged(holder, format, width, height);}@Overridepublic void onSurfaceDestroyed(SurfaceHolder holder) {LogUtil.i(TAG, "onSurfaceDestroyed");super.onSurfaceDestroyed(holder);mHandler.removeCallbacks(runnable);}}
}
package com.xbh.viewsonic.display.wallpaper.helper;import android.content.Intent;
import android.content.res.AssetFileDescriptor;
import android.content.res.AssetManager;
import android.media.MediaPlayer;
import android.service.wallpaper.WallpaperService;
import android.view.SurfaceHolder;import com.blankj.utilcode.util.SPUtils;
import com.blankj.utilcode.util.Utils;
import com.xbh.viewsonic.util.LogUtil;import java.io.File;
import java.io.IOException;public class VideoWallpaper extends WallpaperService {private static final String TAG = "VideoWallpaper";public static final String CLOSE_VOLUME = "close_volume";public static String VIDEO_WALLPAPER = "video_wallpaper";@Overridepublic void onCreate() {super.onCreate();LogUtil.d(TAG, "VideoWallpaper onCreate");}@Overridepublic Engine onCreateEngine() {LogUtil.d(TAG, "VideoWallpaper onCreateEngine");return new VideoEngine();}@Overridepublic void onDestroy() {super.onDestroy();LogUtil.d(TAG, "VideoWallpaper onDestroy");}class VideoEngine extends Engine {private MediaPlayer mp;private int progress = 0;private String path;@Overridepublic void onCreate(SurfaceHolder surfaceHolder) {super.onCreate(surfaceHolder);LogUtil.d(TAG, "VideoEngine onCreate");setTouchEventsEnabled(true);path = SPUtils.getInstance().getString(VIDEO_WALLPAPER, "wallpaper_004.mov");if (path.contains(File.separator)) {setFileDataAndPlay(path);} else {setAssetsDataAndPlay(path);}}@Overridepublic void onSurfaceCreated(SurfaceHolder holder) {mp.setSurface(holder.getSurface());LogUtil.d(TAG, "VideoEngine onSurfaceCreated");//mp.setVideoScalingMode(MediaPlayer.VIDEO_SCALING_MODE_SCALE_TO_FIT);}@Overridepublic void onVisibilityChanged(boolean visible) {LogUtil.d(TAG, "VideoEngine onVisibilityChanged");if (mp != null) {if (visible) {if (!mp.isPlaying()) {mp.reset();mp.release();if (path.contains(File.separator)) {setFileDataAndPlay(path);} else {setAssetsDataAndPlay(path);}mp.setSurface(getSurfaceHolder().getSurface());mp.start();return;}setCloseVolume();mp.seekTo(progress);mp.start();} else {progress = mp.getCurrentPosition();mp.pause();}}}@Overridepublic void onDestroy() {LogUtil.d(TAG, "VideoEngine onDestroy");destroy();super.onDestroy();}public void destroy() {if (mp != null) {mp.stop();mp.reset();mp.release();}}/*** aapt不压缩assets文件类型,如果还有需要不压缩的,在build中添加* ".jpg", ".jpeg", ".png", ".gif",* ".wav", ".mp2", ".mp3", ".ogg", ".aac",*  ".mpg", ".mpeg", ".mid", ".midi", ".smf", ".jet",*  ".rtttl", ".imy", ".xmf", ".mp4", ".m4a",*  ".m4v", ".3gp", ".3gpp", ".3g2", ".3gpp2"*  ".amr", ".awb", ".wma", ".wmv"* @param path*/private void setAssetsDataAndPlay(String path) {AssetManager assetManager = Utils.getApp().getAssets();try {AssetFileDescriptor fileDescriptor = assetManager.openFd(path);mp = new MediaPlayer();mp.setDataSource(fileDescriptor.getFileDescriptor(),fileDescriptor.getStartOffset(),fileDescriptor.getLength());mp.prepare();} catch (IOException e) {LogUtil.d(TAG, "Create player error: " + e.toString());e.printStackTrace();}mp.setLooping(true);setCloseVolume();}private void setFileDataAndPlay(String path) {try {mp = new MediaPlayer();mp.setDataSource(path);mp.prepare();} catch (IOException e) {LogUtil.d(TAG, "Create player error: " + e.toString());e.printStackTrace();}mp.setLooping(true);setCloseVolume();}/*** 是否播放声音*/private void setCloseVolume() {if (SPUtils.getInstance().getBoolean(CLOSE_VOLUME, false)) {mp.setVolume(0.0f, 0.0f);} else {mp.setVolume(0.7f, 0.7f);}}}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {return START_STICKY;}
}
package com.xbh.viewsonic.display.wallpaper.helper;import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.os.Handler;
import android.service.wallpaper.WallpaperService;
import android.view.MotionEvent;
import android.view.SurfaceHolder;import com.blankj.utilcode.util.SPUtils;
import com.blankj.utilcode.util.ScreenUtils;
import com.xbh.viewsonic.R;import java.util.ArrayList;
import java.util.List;
import java.util.Random;/*** Created by Tyhj on 2017/5/23.*/public class MallpaperService extends WallpaperService {public static String STILL_PAPER_KEY = "still _paper_key";private final Handler mHandler = new Handler();Bitmap newbm;@Overridepublic void onCreate() {int resourceID = SPUtils.getInstance().getInt(STILL_PAPER_KEY, R.mipmap.wallpaper_01);Bitmap bitmap = BitmapFactory.decodeResource(getResources(), resourceID);// 获得图片的宽高int width = bitmap.getWidth();int height = bitmap.getHeight();// 设置想要的大小int newWidth = ScreenUtils.getScreenWidth();int newHeight = ScreenUtils.getScreenHeight();// 计算缩放比例float scaleWidth = ((float) newWidth) / width;float scaleHeight = ((float) newHeight) / height;// 取得想要缩放的matrix参数Matrix matrix = new Matrix();matrix.postScale(scaleWidth, scaleHeight);// 得到新的图片newbm = Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix, true);super.onCreate();}@Overridepublic Engine onCreateEngine() {return new Mngine();}//Engine是WallpaperService中的一个内部类,实现了壁纸窗口的创建以及Surface的维护工作class Mngine extends Engine {float touchX = 0;float touchY = 0;boolean isTouch;Paint paint;int width;int height;List<Mycircle> mycircleList;int distance = 100;float speed = 1.7f;int count = 55;float radius = 3.5f;int gap = 1;int length = 8;private boolean mVisible;private final Runnable mDrawCube = new Runnable() {public void run() {drawFrame();}};private void drawFrame() {final SurfaceHolder holder = getSurfaceHolder();Canvas canvas = null;canvas = holder.lockCanvas();canvas.save();/*paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));canvas.drawPaint(paint);paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC));*/canvas.drawBitmap(newbm, 0, 0, paint);for (int i = 0; i < mycircleList.size(); i++) {if (mycircleList.get(i).startX > width || mycircleList.get(i).startX < 0) {mycircleList.get(i).speedX = -mycircleList.get(i).speedX;}if (mycircleList.get(i).startY > height || mycircleList.get(i).startY < 0) {mycircleList.get(i).speedY = -mycircleList.get(i).speedY;}mycircleList.get(i).startX = mycircleList.get(i).startX + mycircleList.get(i).speedX;mycircleList.get(i).startY = mycircleList.get(i).startY + mycircleList.get(i).speedY;//画圆canvas.drawCircle(mycircleList.get(i).startX, mycircleList.get(i).startY, mycircleList.get(i).radius, mycircleList.get(i).paint);}//画连接线for (int i = 0; i < mycircleList.size() - 1; i++) {for (int j = i + 1; j < mycircleList.size(); j++) {float x = mycircleList.get(i).startX - mycircleList.get(j).startX;float y = mycircleList.get(i).startY - mycircleList.get(j).startY;if (x * x + y * y < mycircleList.get(i).distance * distance * distance) {canvas.drawLine(mycircleList.get(i).startX, mycircleList.get(i).startY,mycircleList.get(j).startX, mycircleList.get(j).startY, mycircleList.get(i).paint);}}}//点击时候处理if (isTouch) {List<Mycircle> connect = new ArrayList<Mycircle>();canvas.drawCircle(touchX, touchY, 5, paint);for (int i = 0; i < mycircleList.size(); i++) {float x = mycircleList.get(i).startX - touchX;float y = mycircleList.get(i).startY - touchY;if (x * x + y * y < 8 * distance * distance) {canvas.drawLine(mycircleList.get(i).startX, mycircleList.get(i).startY,touchX, touchY, mycircleList.get(i).paint);connect.add(mycircleList.get(i));}}for (int i = 0; i < connect.size(); i++) {for (int k = connect.size() - 1; k > i; k--) {float x = connect.get(i).startX - connect.get(k).startX;float y = connect.get(i).startY - connect.get(k).startY;if (x*x+y*y<10*distance*distance) {canvas.drawLine(connect.get(i).startX, connect.get(i).startY,connect.get(k).startX, connect.get(k).startY, connect.get(i).paint);}}}}int x = width / 4;int y = height / 4;canvas.restore();holder.unlockCanvasAndPost(canvas);mHandler.removeCallbacks(mDrawCube);if (mVisible) {mHandler.postDelayed(mDrawCube, 10);}}@Overridepublic void onCreate(SurfaceHolder surfaceHolder) {super.onCreate(surfaceHolder);setTouchEventsEnabled(true);}public Mngine() {paint = new Paint();paint.setAntiAlias(true);//设置颜色paint.setColor(Color.WHITE);//设置背景//canvas.drawColor(Color.WHITE);mycircleList = new ArrayList<Mycircle>();Random random = new Random(System.currentTimeMillis());for (int i = 0; i < count; i++) {int distance = 1;int alpha = random.nextInt(60) + 40;float radius = this.radius * random.nextFloat() + 1.5f;float startX = random.nextInt(1080);float startY = random.nextInt(1920);float speedX = speed - 2 * speed * random.nextFloat();float speedY = speed - 2 * speed * random.nextFloat();if (speedX == 0)speedX = 0.5f;if (speedY == 0)speedY = -0.5f;if (i % 50 == 0)distance = 2;else if (i % 30 == 0)distance = 2;else if (i % 20 == 0)distance = 2;if (radius < 0.7f)distance = 0;Mycircle mycircle = new Mycircle(radius, startX, startY, speedX, speedY, alpha, distance);mycircleList.add(mycircle);}}@Overridepublic void onDestroy() {super.onDestroy();mHandler.removeCallbacks(mDrawCube);}@Overridepublic void onVisibilityChanged(boolean visible) {mVisible = visible;/*下面这个判断好玩,就是说,如果屏幕壁纸状态转为显式时重新绘制壁纸,否则黑屏幕,隐藏就可以*/if (visible) {drawFrame();} else {mHandler.removeCallbacks(mDrawCube);}}@Overridepublic void onTouchEvent(MotionEvent event) {switch (event.getAction()) {case MotionEvent.ACTION_DOWN:isTouch = true;touchX = event.getX();touchY = event.getY();break;case MotionEvent.ACTION_MOVE:isTouch = true;touchX = event.getX();touchY = event.getY();break;case MotionEvent.ACTION_UP:isTouch = false;touchX = -1;touchY = -1;break;}}@Overridepublic void onSurfaceChanged(SurfaceHolder holder, int format, int width, int height) {this.width = width;this.height = height;drawFrame();super.onSurfaceChanged(holder, format, width, height);}@Overridepublic void onSurfaceDestroyed(SurfaceHolder holder) {super.onSurfaceDestroyed(holder);mVisible = false;mHandler.removeCallbacks(mDrawCube);}}class Mycircle {int distance;Paint paint;float radius;float startX;float startY;float speedX;float speedY;int alpha;public Mycircle(float radius, float startX, float startY, float speedX, float speedY, int alpha, int distance) {this.radius = radius;this.startX = startX;this.startY = startY;this.speedX = speedX;this.speedY = speedY;this.alpha = alpha;paint = new Paint();paint.setAntiAlias(true);//设置颜色paint.setColor(Color.WHITE);paint.setAlpha(alpha);this.distance = distance;}}}

AndroidManifest中配置

 <!--GIF动态壁纸--><serviceandroid:enabled="true"android:exported="true"android:name=".display.wallpaper.helper.GifWallpaperService"android:permission="android.permission.BIND_WALLPAPER"><!-- 为动态壁纸配置intent-filter --><intent-filter><action android:name="android.service.wallpaper.WallpaperService" /></intent-filter><!-- 为动态壁纸配置meta-data --><meta-dataandroid:name="android.service.wallpaper"android:resource="@xml/livewallpaper" /></service><!--视频动态壁纸--><serviceandroid:enabled="true"android:exported="true"android:name=".display.wallpaper.helper.VideoWallpaper"android:permission="android.permission.BIND_WALLPAPER"><!-- 为动态壁纸配置intent-filter --><intent-filter><action android:name="android.service.wallpaper.WallpaperService" /></intent-filter><!-- 为动态壁纸配置meta-data --><meta-dataandroid:name="android.service.wallpaper"android:resource="@xml/livewallpaper" /></service><!--静态壁纸,用来做中间跳板使用--><serviceandroid:enabled="true"android:exported="true"android:name=".display.wallpaper.helper.MallpaperService"android:permission="android.permission.BIND_WALLPAPER"><!-- 为动态壁纸配置intent-filter --><intent-filter><action android:name="android.service.wallpaper.WallpaperService" /></intent-filter><!-- 为动态壁纸配置meta-data --><meta-dataandroid:name="android.service.wallpaper"android:resource="@xml/livewallpaper" /></service>
livewallpaper.xml
<?xml version="1.0" encoding="utf-8"?>
<wallpaper xmlns:android="http://schemas.android.com/apk/res/android"android:settingsActivity=".display.wallpaper.LiveWallPreference"android:thumbnail="@mipmap/ic_launcher"android:description="@string/display_wallpaper_desc" />

添加权限:

    <uses-permission android:name="android.permission.BIND_WALLPAPER"/><uses-permission android:name="android.permission.SET_WALLPAPER_COMPONENT"/>

参考项目链接:

链接:https://pan.baidu.com/s/1_ukpxLJia_GQ-72xCj_TqA 
提取码:c58f

Android 设置动态壁纸没有确认按钮处理方式相关推荐

  1. win10动态壁纸怎么设置_教程:iPhone/Android设置动态壁纸

     提示:点击"软曼网"↑免费订阅本公众号 昨天分享了一篇文章<干啥?想偷看手机?滚!>,很多网友留言不知道如何下载和设置.今天就在分享一下下载和设置方法.用动态Gif图 ...

  2. Android使用WallpaperService和openGL ES生成的动态图形设置动态壁纸

    针对使用WallpaperService和openGL ES得到的动态图形设置动态壁纸的说明 1.首先创建一个MyselfWallpaperService类继承于WallpaperService类.在 ...

  3. android 无动态壁纸,设置的安卓动态壁纸,为什么过一会就自动没有了?

    设置的安卓动态壁纸,为什么过一会就自动没有了?以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 设置的安卓动态壁纸,为什么 ...

  4. win10怎么设置动态壁纸

    我们win10系统更新完后,会自带系统壁纸供我们使用,如果大家不喜欢的话也可以自己下载喜欢的壁纸来使用,今天小编就教大家如何在win10上设置动态壁纸,大家一起来学习下吧. win10怎么设置动态壁纸 ...

  5. Android自定义壁纸预览界面,Android自定义动态壁纸开发(时钟)

    看到有些手机酷炫的动态壁纸,有没有好奇过他们是如何实现的,其实我们自己也可以实现. 先看效果 上图是动态壁纸钟的一个时钟. 我们先来看看 Livewallpaper(即动态墙纸)的实现,Android ...

  6. 电脑怎么设置动态壁纸?关于Windows和Mac壁纸的设置方法

    为了让电脑桌面更加美观舒适,很多人都会给电脑的桌面设置自己喜欢的壁纸.图片壁纸很多人都会设置,但是电脑怎么设置动态壁纸?这是很多人的困扰.其实方法同样很简单,下面有关于Windows和Mac动态壁纸的 ...

  7. linux桌面动态,ubuntu 中设置动态壁纸

    为了开发android 功能,ubuntu系统也使用了好久时间,作为一个经常使用的系统,不捣鼓捣鼓就太平淡,根据网上的一些介绍,搞了一个动态壁纸出来,用来定时更换壁纸. 首先创建一个文件夹,里面三个文 ...

  8. Android OpenGL动态壁纸

    Android OpenGL动态壁纸 首先申明下,本文为笔者学习<OpenGL ES应用开发实践指南>的笔记,并加入笔者自己的理解和归纳总结. 1.动态壁纸的Service组件 Wallp ...

  9. 怎么设置动态壁纸?这样做就行!

    案例:怎么设置动态壁纸 [朋友们,我的壁纸一直都是静态的,最近感觉有点审美疲劳了,想换些好看的动态壁纸,有朋友知道应该如何设置动态壁纸吗?] 经常使用电脑的朋友可能会觉得一直用同一张壁纸会感觉审美疲劳 ...

最新文章

  1. 谭浩强c语言第六章兔子数列,谭浩强 C语言 第6章_循环.ppt
  2. 实现windows的负载均衡
  3. 内核对象——Windows核心编程学习手札系列之三
  4. shader 3 rendering path
  5. 16、Java Swing JProgressBar:进度条组件
  6. 最新发布丨游戏市场“超预期”增长背景下,如何加速产品精品化 运营精细化?...
  7. ctf.show-萌新计划(1-7)
  8. 蓝桥杯第六届省赛JAVA真题----循环节长度
  9. 基于visual Studio2013解决C语言竞赛题之1010计算
  10. 您的博文被删除了(1)
  11. Linux上安装rz和sz命令
  12. CentOS6 图形界面(gnome)安装(转)
  13. 高德地图——地理围栏
  14. 偏微分方程数值解主要步骤
  15. win10 Kafka环境搭建 + 编译C++(librdkafka) 封装库
  16. Boobooke (播布客) 是个好网站
  17. 八卦罗盘动态时钟(C语言)
  18. CISSP备考大全(完整版)
  19. 【基础】Premultiplied Alpha Blending/Alpha预乘/透明图片黑边
  20. Inception-V3论文翻译——中英文对照

热门文章

  1. 学习动态代理stepbystep(3)
  2. ipad使用rd client连接windows电脑
  3. 2012 年1月1日
  4. 计算机理论与实践相结合,初中信息技术教学如何实现理论和实践的结合
  5. 你和导师之间发生过哪些有趣的事?
  6. vue查看本地相册_使用Vue.js构建的Google相册相册查看器
  7. 一文跟我玩转lvgl Gui guider
  8. lmpl java_究竟是什么毁了我的impl实现
  9. 如何区分「B2B、B2C、C2C、C2B、C2C2B、C2B2B、O2O、ABC、B2G、BMC」?
  10. 书讯 | DAMA中国新书《财务数据治理实战》即将发售