1、看到我的标题,不要太惊讶,不做过多解释,其实就是用App给手机设置一个壁纸,以提升当前应用的进程等级,这个时候基本应用关闭了,进程还是在的。
2、直接上代码
一、设置壁纸用啥呢?就用 WallpaperService 具体干嘛的,自己去查查吧
public class LiveWallpaperServiceextends WallpaperService {
private static final StringTAG ="LiveWallpaperService";
private int mIndex =0;
@Override
public EngineonCreateEngine() {
return new WallpaperEngine(this);
}
public class WallpaperEngineextends Engine {
private MediaPlayermediaPlayer =null;
private Contextcontext;
public WallpaperEngine(LiveWallpaperService liveWallpaperService) {
this.context = liveWallpaperService;
}
@Override
public void onSurfaceCreated(SurfaceHolder holder) {
super.onSurfaceCreated(holder);
mIndex++;
}
public void showWall() {
try {
Canvas canvas = getSurfaceHolder().lockCanvas();
if (canvas ==null)
return;
Bitmap bitmap = creatBitamp();
if (bitmap !=null) {
canvas.drawBitmap(bitmap, 0.0F, 0.0F, new Paint());
}else {
canvas.drawColor(Color.WHITE);
}
getSurfaceHolder().unlockCanvasAndPost(canvas);
return;
}catch (Exception exception) {
return;
}
}
public BitmapcreatBitamp() {
Bitmap bitmap =null;
// 获取壁纸管理器
// 获取壁纸
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
try {
if (mIndex <=1 && !isLiveWallpaperRunning(context, getPackageName())) {
Drawable showDrawable = getResources().getDrawable(R.mipmap.wall_pager_img);
if (showDrawable ==null) {
return null;
}
bitmap = drawableToBitmap(showDrawable);
bitmap = Bitmap.createScaledBitmap(bitmap,
ScreenUtils.getScreenSize(context)[0],
ScreenUtils.getScreenSize(context)[1], true);
}else {
WallpaperManager wallpaperManager = WallpaperManager.getInstance(getApplicationContext());
Drawable wallpaperDrawable = wallpaperManager.getDrawable();
bitmap = drawableToBitmap(wallpaperDrawable);
}
}catch (Exception e) {
e.printStackTrace();
}
}
return bitmap;
}
/**
* Drawable转换成一个Bitmap
*
* @param drawable drawable对象
* @return
*/
public BitmapdrawableToBitmap(Drawable drawable) {
Bitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(),
drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888 : Bitmap.Config.RGB_565);
Canvas canvas =new Canvas(bitmap);
drawable.setBounds(0, 0, drawable.getIntrinsicWidth(),
drawable.getIntrinsicHeight());
drawable.draw(canvas);
return bitmap;
}
@Override
public void onSurfaceDestroyed(SurfaceHolder holder) {
super.onSurfaceDestroyed(holder);
}
@Override
public void onDestroy() {
Log.i("方法方法付", "onDestroy()");
if (mediaPlayer !=null) {
mediaPlayer.reset();
mediaPlayer.release();
mediaPlayer =null;
}
super.onDestroy();
}
@Override
public void onVisibilityChanged(boolean visible) {
super.onVisibilityChanged(visible);
if (visible) {
showWall();
}
}
}
// 这个是用来判断当前App 设置的壁纸是否还在活着,(可能会被其他App替换,这样就会导致保活失效)
public static boolean isLiveWallpaperRunning(Context context, String tagetPackageName) {
// 得到壁纸管理器
WallpaperManager wallpaperManager = WallpaperManager.getInstance(context);
// 如果系统使用的壁纸是动态壁纸话则返回该动态壁纸的信息,否则会返回null
WallpaperInfo wallpaperInfo = wallpaperManager.getWallpaperInfo();
if (wallpaperInfo !=null) {
// 如果是动态壁纸,则得到该动态壁纸的包名,并与想知道的动态壁纸包名做比较
String currentLiveWallpaperPackageName = wallpaperInfo.getPackageName();
if (currentLiveWallpaperPackageName.equals(tagetPackageName)) {
return true;
}
}
return false;
}
}
上面就一个外部class 类,ScreenUtils 是用来设置bitmap的宽高的,因为设置壁纸,肯定要把图设置的和手机屏幕宽高一样,所以他就是或者屏幕宽高的,代码就不贴合出来了,自己写吧,这种代码多的很。
二、第二部就是在你的闪屏也,每次进来的时候判断,用上面的最后一个方法就可以判断当前App设置的壁纸是否还在,不在的话,为了保活效果,需要在设置一次。在的就直接进入App
App如果进入设置壁纸页面后,需要闪屏页重写 onActivityResult 方法,可以通过判断壁纸是否设置完成。剩下的就不用管了。完成 了。
接下来的就是你想要保活所要的事情了,接收推送?还是固定时间做什么事,等等,你还可以在进入应用开启一个service,这个service会告诉你你的应用是否还在活着,因为现在service 都必须设置为前台可见的service通知,所以能看到。具体想干什么,就去做吧......
三、当前这个设置壁纸的service是需要在在清单文件中注册的,怎么写呢?
先写一个xml : live_wall_paper.xml
<wallpaper xmlns:android="http://schemas.android.com/apk/res/android"
android:thumbnail="@mipmap/ic_launcher" />
xml 就上面那点东西就行啦
然后注册壁纸
<service
android:name=".service.LiveWallpaperService"
android:label="@string/app_name"
android:permission="android.permission.BIND_WALLPAPER">
<!-- 为实时壁纸配置intent-filter -->
<action android:name="android.service.wallpaper.WallpaperService" />
<!-- 为实时壁纸配置meta-data -->
android:name="android.service.wallpaper"
android:resource="@xml/live_wall_paper" />
</service>
好了,这才结束吗!快去试试吧!
作为android 开发是喜欢,作为用户吗,我讨厌做这个事的人,不喜欢后天一直运行App,会让手机耗电快,卡,,,,,
网友评论