Well, I found the solution myself. It turned out that I was close :)
To start a third-party application / activity, the simplest solution is to create some kind of proxy activity, which will set the appropriate flags in the window, and then start the desired activity and exit.
An example code is shown below:
call intent to widget (calling proxy):
@Override public void onReceive(Context context, Intent intent) { Utilities.printLog(TAG, "onReceive"); Utilities.printLog(TAG, "intent: " + intent); if (intent.getAction().equals(ACTION)) { final String number = intent.getStringExtra(EXTRAS); Toast.makeText(context, "Selected number: " + number, Toast.LENGTH_SHORT) .show(); /** REMOVING KEYGUARD RECEIVER **/ // not really an option - lock is still holded by widget and screen // cannot be locked again ;( // KeyguardManager keyguardManager = (KeyguardManager) context // .getSystemService(Context.KEYGUARD_SERVICE); // KeyguardLock lock = keyguardManager // .newKeyguardLock(Context.KEYGUARD_SERVICE); // lock.disableKeyguard(); final Intent activity = new Intent(context, MainActivity.class); activity.putExtras(intent.getExtras()); activity.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); activity.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); activity.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); context.startActivity(activity); } super.onReceive(context, intent); }
in proxy activity just call:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getWindow().requestFeature(Window.FEATURE_NO_TITLE); // getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED); getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD); final Intent callingIntent = getIntent(); final String actionToLaunch = callingIntent.getStringExtra(ContactsStackWidgetProvider.ACTION); final String number = callingIntent.getStringExtra(ContactsStackWidgetProvider.EXTRAS); final Intent activity = new Intent(); if (actionToLaunch.equals(Intent.ACTION_DIAL)) { activity.setAction(Intent.ACTION_DIAL); activity.setData(Uri.parse("tel:"+number)); } else if (actionToLaunch.equals(Intent.ACTION_SENDTO)) { activity.setAction(Intent.ACTION_SENDTO); activity.setData(Uri.parse("sms:"+number)); } else { throw new IllegalArgumentException("Unrecognized action: " + actionToLaunch); } new Handler().postDelayed(new Runnable() { @Override public void run() { startActivity(activity); finish();//it is important to finish, but after a small delay } }, 50L); }
source share