Uninstalls

1 - 5M downloads with one line description length? Good job… Although I guess it were different times back in 2012 when you launched the app. Why don’t you develop any more apps? I guess it could give more profits than to squeeze cash from this old app. Its just a side note :slight_smile:
7% conversion rate is extremely high. Also the eCPM of $30 - $50 looks quite high if you ask me… But I guess its worth to check it out. I hope @ramzixp will share his thoughts about this method soon. I’m getting close to releasing my first big game and its my main focus, I don’t have high uninstall volume at the moment so for now I’ll wait and see if anyone comments on this topic. @fredbaker - I edited my first post. I think it would be best if you edit yours. You were quite open in the post that I “Like”'d, your first post should be just like that - it would be received much better than the vague one.

Yes 2012 was different times I was the only signal boosting app.
I have more apps in my possession but under different accounts, afraid Google is the kind of sheriff you don’t want pissing off so splitting the eggs.
As you probably noticed I’m being cautious and under the radar, don’t want anyone knowing me, rather make my money and feed my kid.

I will edit my comments as well, thank you for coming around proving you’re a decent guy.

public static ComponentName a(Context paramContext, Uri paramUri, String paramString)
  {
    Intent localIntent = new Intent(paramString, paramUri);
    PackageManager localPackageManager = paramContext.getPackageManager();
    ResolveInfo localResolveInfo1 = localPackageManager.resolveActivity(localIntent, 65536);
    if (localResolveInfo1 == null)
      return null;
    ComponentName localComponentName = new ComponentName(localResolveInfo1.activityInfo.packageName, localResolveInfo1.activityInfo.name);
    c.a(a, "before checking: " + localComponentName.toString());
    if ((localComponentName.getPackageName().contains("Resolver")) || (localComponentName.getClassName().contains("Resolver")))
    {
      long l = 0L;
      List localList = localPackageManager.queryIntentActivities(localIntent, 0);
      Iterator localIterator = localList.iterator();
      while (localIterator.hasNext())
      {
        ResolveInfo localResolveInfo2 = (ResolveInfo)localIterator.next();
        PackageInfo localPackageInfo = null;
        try
        {
          localPackageInfo = localPackageManager.getPackageInfo(localResolveInfo2.activityInfo.packageName, 0);
          if (localPackageInfo == null)
            continue;
        }
        catch (PackageManager.NameNotFoundException localNameNotFoundException)
        {
        }
        continue;
        if (localPackageInfo.lastUpdateTime > l)
        {
          l = localPackageInfo.lastUpdateTime;
          localComponentName = new ComponentName(localResolveInfo2.activityInfo.packageName, localResolveInfo2.activityInfo.name);
          c.a(a, "while checking: " + localComponentName.toString());
        }
      }
    }
    return localComponentName;
  }

Probably this + inifinite checking service.

@ramzixp
So, basically you say to make a service that will work in the background and every second or so it will check if the user is currently uninstalling the application? And if he is uninstalling your application, then open the ad in a browser? I don’t quite get your code as variable names are not too descriptive (and actually I don’t want the code, just the idea to do it by myself).

Yes, you have to detect if uninstall intent for your package name is opened. With service. This “Resolver” class name is probably dialog on uninstall activity to confirm.

Can you post sample code that will launch a web page in browser after user uninstalls your app? SHow adsense ads, or make a page saying thank you for trying out our app, maybe you can try my other apps and show more apps of yours on a web page.

It would be some mobile webpage in html5, just open intent with URI from service. I haven’t solution yet, worked hard from 4pm (CET) to 4am on my apps and had no time for this but tomorrow I’ll make some solution. This uninstall monetization can be great :smiley:

Ok Awesome Looking forward, this will be extremely useful especially for 3rd party app markets where most apps get uninstalled after 5 minutes. Will also help drive traffic to my website where users can download and try out more apps.

Here are 3 solutions, 1 in text, second is Reto Meier’s (this appjolt is using it! Ill try to find his book or different example) and third in comments. All we have to know is App Installer package name and class name for activity :wink:

General:

  1. Make service in alarm manager reapeating for example 5 seconds, checking haven’t big impact for battery
  2. Put one of solutions to detect intent activity for uninstall our package (alert dialog moment)
  3. Display from service some browser intent with your URI (website)
  4. Display ads/house ads/cpi offers or your own survey on mobile website

There is impossible to make it with the easiest way like receiver for action “deleted” because every app except your will receive oO - some security :wink:

thanks for sharing, is this your own offer or it comes from appjolt? i was also approached by a similar service/company called appbye

Anyone made this without external services like appjolt?

It piqued my curiosity so I’ve taken a look under the hood…

Not really.

This decompiled method check availability of activity which can handle given implicit intent using following algorithm: first it uses resolveActivity and if returned component is named ResolverActivity (default app selection activity) it fallback to queryIntentActivities (btw this ugly hack with hardcoded internal name is totally useless, using queryIntentActivities would be enough). It cannot be used for uninstall detection, if used to detect self package name/action service will be killed long before it’d have a chance to detect uninstall, if used with package installer action it will always return true (package installer is always present, isn’t it?).

Appjolt actually uses much more complicated and convoluted method: it contains native executable (ELF for all supported ABIs, that is armabi, armabi-v7a, x86 and mips) compiled into java as base64 static string which then is decoded, saved as file on which setExecutable(true) is called and then executed through Runtime.exec with arguments being: browser package name (discovered with method pasted above), uri and some other generated file name. This other file content is also compiled into java in encoded form (but not with base64 and since it’s content is written as is I’m guessing its decoded in native).

Now, I haven’t decompiled native code but in mentioned ELF one can find following string: “am start -a android.intent.action.VIEW”, so it’s clear that this native executable is used to detect uninstall (possibly with help of this other file) upon which it starts browser with supplied link through activity manager tool (above am command). There is one other interesting tidbit: there is a method to terminate this watcher as they call it, it uses ps shell command to find this spawned process pid and then calls Process.killProcess(pid).

It’s clearly not Google Play compliant and it probably won’t work on all devices (it also can be easily blocked in newer version of android if haven’t already so).

I just an offer from appia.

Yes that’s what I was able to understand as well.
I benchmarked the app, no cpu or utilization it’s as if they actually captured an event signal.
To be honest if they put so much effort into it, I’m ok with using it, I actually like their dashboard and message localization,
it proved me to be very effective in terms of eCPM.

Why do you think it’s not GC?

How if they supports only google play, ad-x and appsflyer link? Is possible to put any? So if you use with appjolt any link, you can be easily banned in their service.

They don’t care, they’re only after the ad impression if the user X’s out, that’s probably how they make their money,
been using them for a month and was also contacted by their reps. to see if everything is ok and I have any feedback for their service.
Try it, you’ll see it works.

So lets user force to uninstall the app…::D:D

Nice idea, but i think this violate Google Policy. I download appjolt and see they use service, this is battery consume method.

And with stackoverflow or ramzixp info, it’s easy to make what you want if user uninstall app. But think twice before use this on Play store.

Yes, I also think that can be a violation: system

System Interference:

An app downloaded from Google Play (or its components or derivative elements) must not make changes to the user’s device outside of the app without the user’s knowledge and consent.
This includes behavior such as replacing or reordering the default presentation of apps, widgets, or the settings on the device. If an app makes such changes with the user’s knowledge and consent, it must be clear to the user which app has made the change and the user must be able to reverse the change easily, or by uninstalling the app altogether.
Apps and their ads must not modify or add browser settings or bookmarks, add homescreen shortcuts, or icons on the user’s device as a service to third parties or for advertising purposes.
Apps and their ads must not display advertisements through system level notifications on the user’s device, unless the notifications derive from an integral feature provided by the installed app (e.g., an airline app that notifies users of special deals, or a game that notifies users of in-game promotions).
Apps must not encourage, incentivize, or mislead users into removing or disabling third-party apps except as part of a security service provided by the app.

Well, they kind of do, I’ve decompiled native part as well and its actually really trivial.

Because it violates points 2-4 from Ad Policy (Developer Policy Center) that is: Ad Context, Ad Walls and Interstitial Ads and System Interference