Search code examples
androidandroid-intentintentfilterandroid-launcher

What are alternative ways to launch my app?


I can launch my app by:

  1. Tapping on its icon in launcher
  2. Registering "visible" intent-filter (I mean - user clicks for example "Send with.." then chooses my app)
  3. Entering numeral code in dialer and "call" - "invisible" intent, user cannot choose app, he just enters code

Are there any other ways to launch my app? (I'm mostly interested in something else like "invisible" intent from paragraph 3).

  • Assume that we have clean device only with default system apps (most popular of Google apps are also counted as default) and my app
  • Ways for usual users are preferred, but more difficult approaches will be also useful
  • Variants, which can be used on one device (no other devices needed to approach) are preferred, but "more-than-one-device variants" will also be useful.

Solution

  • You can also run your app from Web browser :

    <intent-filter>
    <data android:scheme="my.special.scheme" />
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.DEFAULT"/>
    <category android:name="android.intent.category.BROWSABLE"/>
    </intent-filter>
    

    You can launch your app on NFC transaction :

    Into mainfest <uses-feature android:name="android.hardware.nfc" />

    Read more about this here : LINK


    You can also register a receiver and launch app when you receive sms with secret code in it :

      public void onReceive(Context context, Intent intent) {
                Bundle bundle = intent.getExtras();
    
                Object messages[] = (Object[]) bundle.get("pdus");
                SmsMessage smsMessage[] = new SmsMessage[messages.length];
                for (int n = 0; n &lt; messages.length; n++) {
                smsMessage[n] = SmsMessage.createFromPdu((byte[]) messages[n]);
                }
    
                String text = smsMessage[0].getMessageBody();
    
    if(text = "yoursecretcode") {
    //launch the app 
    abortBroadcast(); //if you want to hide this messeage
     } 
                }
    

    Required permission : <uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission>


    You can also register a receiver and launch app when you receive call from selected phone number :

    public class ServiceReceiver extends BroadcastReceiver {
      @Override
      public void onReceive(Context context, Intent intent) {
        MyPhoneStateListener phoneListener=new MyPhoneStateListener();
        TelephonyManager telephony = (TelephonyManager) 
        context.getSystemService(Context.TELEPHONY_SERVICE);
        telephony.listen(phoneListener,PhoneStateListener.LISTEN_CALL_STATE);
      }
    }
    
    public class MyPhoneStateListener extends PhoneStateListener {
      public void onCallStateChanged(int state,String incomingNumber){
      switch(state){
    
        case TelephonyManager.CALL_STATE_RINGING:
          String numer = TelephonyManager.EXTRA_INCOMING_NUMBER;
       // launch your app if 'numer' is ...
    
     break;
            }
          } 
        }
    

    You need to this READ_PHONE_STATE permission


    You can also use shell to do this (phone must be rooted):

    For example :

    Runtime.getRuntime().exec("su");
    
    Runtime.getRuntime ().exec ("am start -n com.android.calculator2/.Calculator");
    

    Colleague "Arpan" wrote :

    Tilt Your Phone and Wave your Hand (Basically using a Proximity Sensor to launch App's Intent)

    I give you code sample :

    public class SensorActivity extends Service implements SensorEventListener {
      private SensorManager mSensorManager;
      private Sensor mProximity;
    
      @Override
      public final void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    
        mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
        mProximity = mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
      }
    
      @Override
      public final void onAccuracyChanged(Sensor sensor, int accuracy) {
        // Do something here if sensor accuracy changes.
      }
    
      @Override
      public final void onSensorChanged(SensorEvent event) {
        float distance = event.values[0];
      if(!ss()) // LAUNCH YOUR APP IF ISN't RUNNNING
      }
    
      @Override
      protected void onResume() {
        // Register a listener for the sensor.
        super.onResume();
        mSensorManager.registerListener(this, mProximity, SensorManager.SENSOR_DELAY_NORMAL);
      }
    
      @Override
      protected void onPause() {
        // Be sure to unregister the sensor when the activity pauses.
        super.onPause();
        mSensorManager.unregisterListener(this);
      }
    }
    
    private boolean ss() {
        ActivityManager manager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
        for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
            if ("com.packagename.something.ActivityName".equals(service.service.getClassName())) {
                return true;
            }
        }
        return false;
    }
    

    "Arpan" wrote also :

    Plug any usb devices and put an intent filter in the manifest (If usb host mode available)

    public static boolean isConnected(Context context) {
            Intent intent = context.registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
            int plugged = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
            return plugged == BatteryManager.BATTERY_PLUGGED_AC || plugged == BatteryManager.BATTERY_PLUGGED_USB;
        }
    

    You can paste this to Timer


    I have edited Arpan's post, i added link about Gesture Search in Android® .


    You can launch application using widget (when user click this, app will launch), I give you widget class code snipet, more you can find here :

    package com.helloandroid.countdownexample;
    
    import android.appwidget.AppWidgetManager;
    import android.appwidget.AppWidgetProvider;
    import android.content.Context;
    import android.content.Intent;
    
    
    
    public class CountdownWidget extends AppWidgetProvider {
    
    
        @Override
        public void onDeleted(Context context, int[] appWidgetIds) {
                //called when widgets are deleted
                //see that you get an array of widgetIds which are deleted
                //so handle the delete of multiple widgets in an iteration
                super.onDeleted(context, appWidgetIds);
        }
    
        @Override
        public void onDisabled(Context context) {
                super.onDisabled(context);
                //runs when all of the instances of the widget are deleted from
                //the home screen
                //here you can do some setup
        }
    
        @Override
        public void onEnabled(Context context) {
                super.onEnabled(context);
                //runs when all of the first instance of the widget are placed
                //on the home screen
        }
    
    
    
    @Override
            public void onClick() {
             //your code to launch application...       
            }
    
        @Override
        public void onReceive(Context context, Intent intent) {
                //all the intents get handled by this method
                //mainly used to handle self created intents, which are not
                //handled by any other method
    
    
                //the super call delegates the action to the other methods
    
                //for example the APPWIDGET_UPDATE intent arrives here first
                //and the super call executes the onUpdate in this case
                //so it is even possible to handle the functionality of the
                //other methods here
                //or if you don't call super you can overwrite the standard
                //flow of intent handling
                super.onReceive(context, intent);
        }
    
        @Override
        public void onUpdate(Context context, AppWidgetManager appWidgetManager,
                        int[] appWidgetIds) {
                //runs on APPWIDGET_UPDATE
                //here is the widget content set, and updated
                //it is called once when the widget created
                //and periodically as set in the metadata xml
    
                //the layout modifications can be done using the AppWidgetManager
                //passed in the parameter, we will discuss it later
    
                //the appWidgetIds contains the Ids of all the widget instances
                //so here you want likely update all of them in an iteration
    
                //we will use only the first creation run
                super.onUpdate(context, appWidgetManager, appWidgetIds);
        }
    
    
    }
    

    check if Headphones are plugged in

    Whenever Headphones are plugged in an intent (ACTION_HEADSET_PLUG) will be fired. Check for this via BroadcastReceiver and start Acitivity

    IntentFilter f = new IntentFilter();
    f.addAction(Intent.ACTION_HEADSET_PLUG);
    registerReceiver(headsetPlugReceiver, f);
    
    public BroadcastReceiver headsetPlugReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            // start new Activity or do something else
        }
    };
    

    And in Manifest:

    <receiver android:name="activity.to.receive.headplug.event">    
      <intent-filter>
        <action android:name="android.intent.action.HEADSET_PLUG" />
      </intent-filter>
    </receiver>