精华内容
下载资源
问答
  • Android杀不死的第三方应用,早于系统应用启动的第三方应用始末

    1.为什么第三方应用能早于System的app启动?

          Android应用的启动顺序网上有一大堆资料可以查阅了,这里就不细述了,这里不阐述ROM启动还有bootloader,软件启动的大致流程应该是

    • 启动kernel
    • 运行servicemanager 把一些native的服务用命令启动起来(包括wifi, power, rild, surfaceflinger, mediaserver等等)
    • 启动Dalivk中的第一个进程Zygote -> 启动java 层的系统服务system_server(包括PowerManagerService, ActivityManagerService , telephony.registry, DisplayManagerService等等)该服务中的这些部件跟native的那些服务关联在一起
    • 启动Luncher和Persistent的App,该程序是系统级的在AndroidManifest.xml里声明android:persistent="true"
    • 发出ACTION_BOOT_COMPLETED广播给其他应用。

           在这里需要注意的是声明android:persistent属性为true的APP被kill掉后还是会自动重启的。系统中我们已知android:persistent属性为true的APP肯定有Phone App,也就是说第三方应用应当至少晚于Phone APP启动,如何判断呢?最简单的办法看其PID的大小,PID值越小越先启动。有其第三方应用可以先于Phone APP启动。我们探其应用的AndroidManifest.xml (PS:如何看APK的代码,网上有你懂的apktool等),发现其在AndroidManifest里定义的静态Receiver的intent-filter的属性如下:

           <receiver android:name="com.anguanjia.safe.AAAReceiver">
                <intent-filter android:priority="2147483647"></span>
                    <action android:name="android.bluetooth.adapter.action.STATE_CHANGED" />
                    <action android:name="android.net.wifi.WIFI_STATE_CHANGED" />
                    <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
                    <action android:name="android.intent.action.ANY_DATA_STATE" />
                    <action android:name="android.net.wifi.STATE_CHANGE" />
                </intent-filter>
                <intent-filter android:priority="2147483647">
                    <action android:name="android.intent.action.MEDIA_UNMOUNTED" />
                    <action android:name="android.intent.action.MEDIA_MOUNTED" />
                    <action android:name="android.intent.action.MEDIA_REMOVED" />
                    <action android:name="android.intent.action.MEDIA_CHECKING" />
                    <action android:name="android.intent.action.MEDIA_EJECT" />
                    <data android:scheme="file" />
                </intent-filter>
    

    2147483647 这个值是什么?好大,哦,原来是int的最大值!我们来看下google 文档

    android:priority
        The priority that should be given to the parent component with regard to handling intents of the type described by the filter. This attribute has meaning for both activities and broadcast receivers:

            It provides information about how able an activity is to respond to an intent that matches the filter, relative to other activities that could also respond to the intent. When an intent could be handled by multiple activities with different priorities, Android will consider only those with higher priority values as potential targets for the intent.

            It controls the order in which broadcast receivers are executed to receive broadcast messages. Those with higher priority values are called before those with lower values. (The order applies only to synchronous messages; it's ignored for asynchronous messages.)

        Use this attribute only if you really need to impose a specific order in which the broadcasts are received, or want to force Android to prefer one activity over others.

        The value must be an integer, such as "100". Higher numbers have a higher priority. The default value is 0. The value must be greater than -1000 and less than 1000.

            这个值是receiver的优先级,值越大优先级越高,按优先顺序执行,但是文档介绍优先级值大小是-1000~1000. 该应用的是int的最大值, 但android平台没有对android:priority值进行检查。在开机后该应用Receiver的intent-filter的优先级最高,在该filter里的intent被系统发送出来(android.intent.action.MEDIA_MOUNTE, android.net.wifi.WIFI_STATE_CHANGED等等),这个时候App会根据这个intent而被启动起来。

             这里需要注意的是该Receiver是个静态的,一定是要注册在AndroidManifest里。当Wifi成功注册后会发出WIFI_STATE_CHANGED的消息, 或者其他的部件完成一些事件后也会发出类似的消息,而这些消息的发出又早于属性为persistent的系统级APP的启动, 由此就会发生第三方应用早于系统级APP的启动的情况。


    2. 在Android手机上为什么我想完全关闭的程序关不了?

            有一种理论是Android手机为了有更好的用户体验,会后台自动启动一些程序, 这样我们前台在操作的时候会感觉手机更流畅平滑。但是如果程序运行过多,对CPU 内存的开销过大,往往会导致系统越用越慢,乃至手机挂掉的问题,在内存管理这快Android有两种机制去解决这个问题,一个是在framework层在 trimApplication方法中去实现,另外一个就是在kernel里的lowmemorykiller, 这里不再细述。
            但是对于用户来说,我就是想完全关闭第三方程序,以免过多使用我的流量或者偷偷的做一些我不希望的操作。貌似没有办法去关闭,那为什么呢? 我这里先讲述其中一种情况。
              Service顾名思义是服务,运行在前后台后都可以,即可以运行在当前进程也可以运行在其他的进程里,Service可以为多个APP共享使用,是通过binder机制来实现的。当我Kill掉一个带有服务的进程(没有调用stopService()), 过一会该应用会自动重启。下面是代码的调用顺序,自下往上查看。

    com.android.server.am.ActiveServices.scheduleServiceRestartLocked(ActiveServices.java)

    com.android.server.am.ActiveServices.killServicesLocked (ActiveServices.java)

    com.android.server.am.ActivityManagerService.cleanUpApplicationRecordLocked(ActivityManagerService.java)

    com.android.server.am.ActivityManagerService.handleAppDiedLocked(ActivityManagerService.java)

    com.android.server.am.ActivityManagerService.appDiedLocked(ActivityManagerService.java)

    com.android.server.am.ActivityManagerService$AppDeathRecipient.binderDied(ActivityManagerService.java)

            从代码流程上我们看出该service被restart,进程也根据该service启动起来, service就运行在重启的进程里。

            在这种情况下是不是就真没办法了呢,当然不是,如果我们在service中覆盖onStartCommand这个函数并且返回值为START_NOT_STICKY,在我们kill该进程后则不会自动重启,我们想关闭的应用也可以完全关闭了,不会再自动重启了。

        public int onStartCommand(Intent intent, int flags, int startId) {
            return START_NOT_STICKY;
        }
    

    Framwork实现代码

    frameworks/base/services/java/com/android/server/am/ActiveServices.java
    
                        case Service.START_NOT_STICKY: {
                            // We are done with the associated start arguments.
                            r.findDeliveredStart(startId, true);
                            if (r.getLastStartId() == startId) {
                                // There is no more work, and this service
                                // doesn't want to hang around if killed.
                                r.stopIfKilled = true;   // 该变量设置为true
                            }
                            break;
                        }
    
                    if (sr.startRequested && (sr.stopIfKilled || canceled)) {    //进入到该条件中
                        if (sr.pendingStarts.size() == 0) {
                            sr.startRequested = false;
                            if (sr.tracker != null) {
                                sr.tracker.setStarted(false, mAm.mProcessStats.getMemFactorLocked(),
                                        SystemClock.uptimeMillis());
                            }
                            if (!sr.hasAutoCreateConnections()) {
                                // Whoops, no reason to restart!
                                bringDownServiceLocked(sr);  //执行在这里,不会重启App
                            }
                        }
                    }
    

            重写onStartCommand方法且返回值为START_NOT_STICKY的代码调用顺序,自下而上查看。

    com.android.server.am.ActiveServices.bringDownServiceLocked(ActiveServices.java)

    com.android.server.am.ActiveServices.killServicesLocked(ActiveServices.java)

    com.android.server.am.ActivityManagerService.cleanUpApplicationRecordLocked(ActivityManagerService.java)

    com.android.server.am.ActivityManagerService.handleAppDiedLocked(ActivityManagerService.java)

    com.android.server.am.ActivityManagerService.appDiedLocked(Activi tyManagerService.java)

    com.android.server.am.ActivityManagerService$AppDeathRecipient.binderDied(ActivityManagerService.java)

            附上Google doc 对于onStartCommand返回值的说明

    For started services, there are two additional major modes of operation they can decide to run in, depending on the value they return from onStartCommand():START_STICKY is used for services that are explicitly started and stopped as needed, whileSTART_NOT_STICKY orSTART_REDELIVER_INTENT are used for services that should only remain running while processing any commands sent to them. See the linked documentation for more detail on the semantics.

           在这里对这个返回值做下解释:

    当服务进程因某种原因(内存不够,强制关闭等)被kill掉时,START_STICKY在系统有充足的内存后重新创建service, 在onStartCommand中handle的是null intent.

    START_NOT_STICKY通知系统不在重新创建该service. 还有一个返回值START_REDELIVER_INTENT重新创建service并且伴随着原来intent的去处理。

    展开全文
  • iOS 打开第三方应用

    千次阅读 2016-06-13 16:02:06
    打开第三方应用

    现在有应用A和应用B两个应用,其中应用B希望可以打开应用A,传递一定的参数给A,实现互动。

    第一步:应用A在info中的URL Types 新建一项,填写对应的identifier和schemes,其中identifier对应应用的Bundle Identifier,schemes是其他应用打开本应用的域名。如下图所示:
    这里写图片描述
    第二步:在应用B的info中添加LSApplicationQueriesSchemes,在array中填写应用A的schemes,如下图所示:
    这里写图片描述
    第三步:在应用B中添加打开应用A的代码

      if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"platformA://"]]) {
    
            NSLog(@"install--");
            [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"platformA://?token=123abct"]];
        }else{
    
            NSLog(@"no---");
    
        }

    第四步:在应用A的appDelegate中添加监控本应用被调用的delegate方法。

    - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url
      sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
    {
        NSLog(@"Calling Application Bundle ID: %@", sourceApplication);
        NSLog(@"URL scheme:%@", [url scheme]);
        NSLog(@"URL query: %@", [url query]);
    
        return YES;
    }
    - (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString*, id> *)options{
        NSLog(@"url: %@", url);
        NSLog(@"options :%@", options);
    
    
        return YES;
    
    }

    其中由于方法1在iOS9以上被废除,所以需要对实际版本最好适配。

    完成以上四步,即可实现应用B打开应用A、并传递参数的功能:

    这里写图片描述
    应用A接收到参数后,通过对参数的分析即可实现需要的功能。


    以上内容为iOS9.0后,APP之间数据传递的用法,但由于URL Schemes的变动,所以必须在主动调用一方APP中维护LSApplicationQueriesSchemes白名单。
    iOS9.0后URL schemes变动

    展开全文
  • 如何打开第三方应用

    千次阅读 2019-05-26 17:46:35
    1、在flutter里面打开第三方应用可以借助插件url_launcher 这个插件是flutter团队为我们提供的,这个插件是用于在flutter里面打开第三方app的 2、 添加依赖,然后点击 Packages get进行安装 3、 引入头文件...

    1、在flutter里面打开第三方应用可以借助插件url_launcher

    这个插件是flutter团队为我们提供的,这个插件是用于在flutter里面打开第三方app的

    2、

    添加依赖,然后点击 Packages get进行安装

    3、

    引入头文件

    4、

    打开浏览器

    5、运行结果:

    6、

    打开第三方应用

    在打开第三方应用的时候,首先要知道该app的schema或者它的url

     

    添加打开地图的方法:

    7、

    调用打开地图的方法

    8、运行结果:

     

    9、

    代码:

    import 'package:flutter/material.dart';
    import 'package:flutter_color_plugin/flutter_color_plugin.dart';
    import 'package:url_launcher/url_launcher.dart';
    void main() => runApp(LaunchPage());
    
    //如何打开第三方应用?
    class LaunchPage extends StatefulWidget {
      @override
      _LaunchPageState createState() => _LaunchPageState();
    }
    
    class _LaunchPageState extends State<LaunchPage> {
      
      _launchURL() async {
        const url = 'https://flutter.io';
        if (await canLaunch(url)) {
          await launch(url);
        } else {
          throw 'Could not launch $url';
        }
      }
    
      _openMap() async{
        //Android
        const url= 'geo:52.32,4.917';//App提供者提供的  schema
        if(await canLaunch(url)){
          await launch(url);
        }else{
          //iOS
          const url='http://maps.apple.com/?ll=52.32,4.917';
          if(await canLaunch(url)){
            await launch(url);
          }else{
            throw 'Could not launch $url';
          }
        }
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text('如何打开第三方应用?'),
            leading:GestureDetector(
              onTap: (){
                Navigator.pop(context);
              },
              child: Icon(Icons.arrow_back),
            )
          ),
          body: Center(
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: <Widget>[
                RaisedButton(
                  onPressed: ()=>_launchURL(),
                  child: Text('打开浏览器'),
                ),
                RaisedButton(
                  onPressed: ()=>_openMap(),
                  child: Text('打开地图'),
                )
              ],
            ),
          ),
    
        );
    
    
      }
    }
    

     

    注:

    出现的异常:

    1、Unhandled Exception: MissingPluginException(No implementation found for method canLaunch on channel plugins.flutter.io/url_launcher)

    解决办法:直接重启Android  Studio,或者先停止项目,再重新运行

     

    展开全文
  • 2.第三方应用不可卸载应用 3.第三方应用不可卸载并且不用动态申请危险权限应用 通常厂商内置应用会放到vendor目录下再创建自己的目录名,把需要预置的apk放入对应目录,并编写对应的mk文件。 应用是否可用卸载...

    一、内置应用分为以下几种:

    1.第三方合作可卸载应用

    2.第三方应用不可卸载应用

    3.第三方应用不可卸载并且不用动态申请危险权限应用

     

    通常厂商内置应用会放到vendor目录下再创建自己的目录名,把需要预置的apk放入对应目录,并编写对应的mk文件。

    应用是否可用卸载会根据类型最后拷贝到不同的目录下,例如system/app(不可卸载),system/ third-app(可卸载),system/priv-app(

    不可卸载并启不用动态申请危险权限)。

     

    二、如何将应用不可卸载并且不用动态申请危险权限

    通常情况下我们的应用都会有自己的签名,如果这个签名和系统签名不同则不会被作为第三类应用的,所以需要和系统签名一样,

    当然我们一般会编写一个mk脚本再编译的时候重新给apk签名保证和系统签名一致。

    以下几步实现不可卸载并且不用动态申请危险权限应用:

    • 在AndroidManifest.xml文件中配置android:sharedUserId="android.uid.system"和系统共享userid
    • 将apk放到对应目录下
    • 编写改apk的mk文件
    • LOCAL_PATH := $(call my-dir)
      include $(CLEAR_VARS)
      # Module name should match apk name to be installed
      LOCAL_MODULE := XXXX
      LOCAL_MODULE_TAGS := optional
      
      LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
      LOCAL_MODULE_CLASS := APPS
      LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
      
      LOCAL_PREBUILT_JNI_LIBS := \
      @lib/armeabi/libxypatch.so
      
      #保留原来应用自身签名
      # LOCAL_CERTIFICATE := PRESIGNED
      #使用系统平台签名
      LOCAL_CERTIFICATE := platform
      include $(BUILD_PREBUILT)

       

    • 将目录mk文件添到系统编译mk文件中按照格式加就行

         # 需要预置的定制应用及三方应用

         PRODUCT_PACKAGES += \
             SogouInput \
              ****

    三、小结

    注意:

    1. 如果在AndroidManifest.xml文件中配置android:sharedUserId="android.uid.system"表示该应用一定要和系统平台签名一致要不然应用无法被解析安装。
    2. 动态申请的危险权限还是要写动态申请方法,如果不写动态申请权限方法系统也不会将这些权限默认赋予改应用,同时也是为了保证应用在被用户手动关闭权限后被再次弹窗提示框让用户手动赋予权限。
    3. 默认赋予应用动态权限只会在第一次启动赋予一次,如果后续手动关闭应用权限则需要弹框提示用户手动赋予权限。
    展开全文
  • Xposed模拟操作第三方应用的控件

    千次阅读 2018-12-14 19:40:07
    使用Xposed设置第三方应用的输入框的值; 使用Xposed点击第三方应用的按钮; 使用Xposed操作密码键盘输入密码; 一、使用Xposed为设置第三方应用的输入框的值 思路:找到EditText对象,再为EditText设置值即可; ...
  • Flutter打开第三方应用

    千次阅读 2019-04-22 10:55:00
    在flutter中打开第三方应用可以使用url_launcher插件 打开https://pub.dartlang.org/,然后搜索url_launcher,然后点击进入该插件界面 大家在installing中可以看到使用方法 首先在pubspec.yaml中添加url_...
  • 系统应用和第三方应用跳转

    千次阅读 2016-06-20 16:27:53
    电话、短信、邮件、网页浏览。调用系统服务、系统应用跳转,第三方应用跳转
  • 打开第三方应用

    千次阅读 2014-04-28 10:13:25
    记录一下,自己用过的打开第三方应用的两种方法; 1.//根据包名类名启动第三方应用(要启动的应用的包名,要启动的activity) openApp("com.xx.test", "com.xx.test.TestActivity"); private void openApp...
  • C#企业微信第三方应用开发OAuth2简介1.注册企业2.新建第三方应用3.网页授权链接插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表...
  • Android禁用第三方应用

    千次阅读 2018-05-02 16:22:02
    需要权限android.Manifest.permission.CHANGE_COMPONENT_ENABLED_STATE...非system app即便在Android Mainfest.xml中强制写上,安装时也部会写入/data/system/packages.xml启用第三方应用图标:PackageManager pm = ...
  • iOS应用可以使用 URL Schemes 进行应用间的...所以这就出现了微信或QQ等知名应用不能打开第三方应用的问题,不能打开是因为微信和QQ使用的是自己研发的QQ浏览器,他不遵循URL Schemes这个协议。 实例演示:(祝第三方
  • Android 获取手机第三方应用列表

    千次阅读 2017-10-19 20:49:10
    往往我们需要对手机装了哪些第三方应用,那么第三方应用列表怎么获取呢? 如下: private List getThirdAppList(Context context) { PackageManager packageManager = context.getPackageManager(); List ...
  • 使用adb工具打开TCL电视的第三方应用安装权限前言安装adb工具打开电视的adb调试开关abd工具打开电视权限 前言 新买的TCL电视往往默认是无法安装第三方应用的,即使用U盘安装了第三方应用,应用也没有升级权限。另外...
  • 企业微信-第三方应用网页授权登陆

    万次阅读 2019-03-05 11:00:32
    1、构造第三方应用网页授权链接 如果第三方应用需要在打开的网页里面携带用户的身份信息,第一步需要构造如下的链接来获取 code: https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&amp;...
  • 支付宝小程序搞定了,想再搞一个第三方应用模版开发模式业务接入 小程序第三方接入文档:https://docs.alipay.com/isv/10436/kcs4o3 获取用户信息流程如下: 1. 创建第三方应用 2. 第三方应用开发配置 ...
  • Android监听进入和退出第三方应用

    千次阅读 2017-08-08 14:13:45
    Android监听进入和退出第三方应用
  • 在手机已Root情况下,我开发的应用如何隐藏第三方应用程序,不要第三方桌面。我的应用获取root权限,是否可以使用 setApplicationEnabledSetting()方法直接隐藏?请有这方面经验的大大指点下。
  • Android系统第三方应用无法读写外置TF卡 车载设备会挂载TF卡进行视频录像的存储,第三方app需要在TF卡目录下进行修改、创建、删除文件等操作,但是外置TF卡第三方应用没有读写权限。 需求实现 AndroidManifest.xml...
  • 以下代码,运行在Android上可以通过第三方的包名来获取第三方应用的MD5签名。
  • 微信中如何拉起第三方应用 其他浏览器都可以 微信是否需要授权或者是白名单?请熟悉的朋友们给点提示和思路
  • Android 8.0系统除了启动service和broadcastreceiver限制以外,还有一个就是在service中启动第三方应用。 解决办法 在android 8.0中启动第三方应用是可以的,所以我就大胆的进行尝试: 1.先启动一个空activity。 2....
  • 由于需要测试微信登录功能,在微信授权登录成功后需要解除绑定功能。一直没有找到对应的方法。 取消已授权的第三方应用APP办法:如何在微信中取消已授权的第三方应用APP ...
  • 小白记录:最近项目对接企业微信,应用的选型是第三方应用,所以研究了一下。做第三方应用开发网站,必不可少的是扫码授权登录,那么该如何入手呢。本人也是小白一枚,第一次接触,故进行记录一下。如果有错,希望...
  • 此次记录了企业授权安装第三方应用(二维码篇) 如果事先没开发过企业微信第三方应用的,先去入门创建一个第三方小程序,具体细节本文中就不提了。 正文: 官方文档:...
  • 我想检查第三方应用程序是否已经启动。 如果我知道 packagename 的话,就能打开第三方应用程序。 比如: Intent intent = getPackageManager().getLaunchIntentForPackage("com.thirdparty.package"); start...
  • 工作中遇到要结束第三方进程的问题,于是进行了了解和结束第三方进程的方法 ActivityManager am = (ActivityManager)mContext.getSystemService(Context.ACTIVITY_SERVICE); am.killBackgroundProcesses...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 42,961
精华内容 17,184
关键字:

第三方应用