I can launch my app by:
- Tapping on its icon in launcher
- Registering "visible" intent-filter (I mean - user clicks for example "Send with.." then chooses my app)
- 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.
You can also run your app from Web browser :
You can launch your app on NFC transaction :
Into mainfest
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 < 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 :
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
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: