Android如何让应用隐形?实战打造无图标后台服务APK

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/weixin_42072033/article/details/109815068

 

大家好,你们的锦荣同学又来啦!现在已经11月底了,在深圳撸代码的我依然穿着个短袖,甚至还有点想穿凉鞋。。。今年应该是我人生中最热的一个冬天,前几年深圳冬天都没这么热。作为一匹90年的老马,我不知不觉已经30岁了,可是我没变秃,但是变强了!自从开始写博客以来,我发现我真的没有以前那么懒散了,会有时间看书,写博客,而不是刷抖音不知不觉的消耗很多时间。

 

好了,我们来聊聊今天的主题,今天的主题比较轻松。我们开发apk应用安装完成的话都会在Launcher上显示一个应用图标,用户点击图标就进入我们的应用,这是我们每一个Android程序员刚开始接触APK开发时都要经历的。那么有很多商显和智能硬件以及手机,厂商是不希望出货的时候,在Launcher上展示一堆图标让客户觉的系统不够简约的,比如我们的小米或者华为手机,其实他里面有很多系统自带的工具apk,但是却没有显示在桌面上,只是在用户需要某个功能的时候完成对应操作。

 

这个月我刚好收到公司提的一个需求,就是按照一个主板系统接口文档,开发一个没有图标在桌面上,没有界面并且接收用户广播完成一些常用系统功能的项目。

大体就是这些功能,其实再多的功能,哪怕有几十项,我们也都是一项一项的去实现的,我们首先要做就是先把整体框架搭起来,先盖房,再装修^_^。

 

 

既然需求是无图标,那么我们这里采用一种data过滤的方法来实现,当然还有其他的方法(比如注释category, Lunch再配置为Nothing),代码如下:

就是在MainActivity的intent-filter中加入data匹配属性,名字随便你起,只要是平时根本用不到的名字就可以了。这样编译生成的apk就没有图标显示在Launcher上了。如果你还想使用这个Activity,那你就只能隐式启动了,像这样。

Intent intent = new Intent();
ComponentName cn = new ComponentName("com.android.wyst", "com.android.wyst.MainActivity");
intent.setComponent(cn);
Uri uri = Uri.parse("com.android.example");
intent.setData(uri);
startActivity(intent);

不过我们的需求就是无图标,无界面,那么我们这里已经两步都实现了,这种方法是经过实际检验的,大家可以放心使用,MainActivity也已经不启动不显示了,要实现我们的功能怎么办呢?对的,就是Android四大组件的service。

 

 

第三步来了,我们新建一个BootBroadcastReceiver广播接收器来接收开机广播,再新建一个InfoDistSysService来进行后台操作,接收到开机广播后就启动我们的InfoDistSysService来进行后台服务。

public class BootBroadcastReceiver extends BroadcastReceiver {private String TAG = "BootBroadcastReceiver";static final String ACTION = "android.intent.action.BOOT_COMPLETED";@Overridepublic void onReceive(Context context, Intent intent) {Log.i(TAG, "onReceive: ");if (intent.getAction().equals(ACTION)) {Intent intent1 = new Intent(context,InfoDistSysService.class);if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {//android8.0以上通过startForegroundService启动servicecontext.startForegroundService(intent1);} else {context.startService(intent1);}}}}

这里注意一下,Android高版本是要通过startForegroundService启动service的,这里要做一个兼容性判断。这样我们就开机启动了InfoDistSysService后台服务,当然如果是你的商用项目,还需要考虑进程挂掉的情况,因为我们是对apk系统签名,所以我们的service的优先级是非常高的,关于如何系统签名可以参照我之前的博客实战讲解Android如何生成系统签名keystore,让AS自写APK系统化,你要考虑的就是进程拉活这种方式。

 

开机成功启动了服务后,那我们就根据项目需求新增所有的功能模块,因为我这里的项目需求是接受客户的广播,所以我们就把所有功能的广播接收器都定义一下。

 

定义好了之后,别忘记在我们开机启动的服务中,动态注册广播,这里注意了,Android高版本是不推荐静态注册自定义广播的,如果你硬是要静态注册自定义广播在AndroidManifest.xml中,也不是不行,只是这违反了google对于用户权益的考虑原则,而且第三方发送广播的时候还需要加上如下代码,十分不便。

Intent intent = new Intent("android.intent.action.screencap");if(Build.VERSION.SDK_INT >= 26) {intent.addFlags(0x01000000);
}MainActivity.this.sendBroadcast(intent);

所以说,我们就乖乖在服务中,把各项功能的广播注册了

当然在onDestroy的时候记得取消注册

 

到这里,我们的房子就盖好了,我们的apk既没有图标,也没有界面,而且开机后就运行在我们的后台为客户进行服务。 我们挑一个装修吧,就以屏幕旋转为例。

public class RotationReceiver extends BroadcastReceiver {private static final String TAG = "RotationReceiver";@Overridepublic void onReceive(Context context, Intent intent) {Log.i(TAG, "RotationReceiver onReceive: ");switch (intent.getAction()){case "android.intent.rotation_0":Log.i(TAG, "旋转角度 0 度");roatation("0");break;case "android.intent.rotation_90":Log.i(TAG, "旋转角度 90 度");roatation("1");break;case "android.intent.rotation_180":Log.i(TAG, "旋转角度 180 度");roatation("2");break;case "android.intent.rotation_270":Log.i(TAG, "旋转角度 270 度");roatation("3");break;default:break;}}public  void roatation(String ro){try {String cmd = "content insert --uri content://settings/system --bind name:s:user_rotation --bind value:i:"+ro+ " \n";Process process = Runtime.getRuntime().exec(cmd);InputStream in1 = process.getInputStream();BufferedReader reader1 = new BufferedReader(new InputStreamReader(in1));String line1;Log.i("back","cat value---------------"+reader1.readLine());in1.close();} catch (IOException e) {e.printStackTrace();}}}

这个小功能就这样实现了,我们发广播让它依次旋转90度,180度,270度。

 

 

可以看到我们的其中一个功能已经搞定了,那么我们看看桌面

 

很干净,并没有出现我们的 InfoDistSys(包名为com.android.wyst)的应用,那我们用adb看看有没有安装这个应用呢?

显示已经安装成功了,我们成功的让apk进行了 “隐形”。

 

到这里,我们今天的博客就结束了,希望大家看了这篇博客后,再碰到这类需求的时候可以少走弯路,信手拈来。回见!

 

 

 


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部