Dealing with implicit intent future deprecation in Lollipop

前端 未结 3 425
清歌不尽
清歌不尽 2021-02-04 10:06

To transmit data to other applications I\'ve been using implicit intents as in examples below:

Intent intent = new Intent();
intent.setAction(\"com.example.OpenU         


        
3条回答
  •  一生所求
    2021-02-04 11:06

    As @Commonsware pointed out in his blog, the 3 ways to resolve this are:

    1. resolveService()

    Intent i = new Intent("serviceName");
    ResolveInfo info = ctx.getPackageManager().resolveService(i, Context.BIND_AUTO_CREATE);
    i.setComponent(new ComponentName(info.serviceInfo.packageName,info.serviceInfo.name));
    

    And use the intent to bind the service.

    2. queryIntentServices()

    Intent i = new Intent("serviceName");
    
    List infos = ctx.getPackageManager().queryIntentServices(i,Context.BIND_AUTO_CREATE);
    
    if (infos.isEmpty()) {
       throw new IllegalStateException("no service found");
    }
    if (infos.size() > 1) {
       throw new SecurityException("multiple services found, could be a security issue");
    }
    
    i.setComponent(new ComponentName(infos.get(0).serviceInfo.packageName, infos.get(0).serviceInfo.name));
    

    If the query returns more than one info, this could mean a malicous services is listening.

    3. setPackage()

    If you have the package name, you could just set the package name as @matiash said in his post:

    Intent i = new Intent(MyClass.class.getName());
    i.setPackage(MyClass.class.getPackage().getName())
    

提交回复
热议问题