13

I am trying to start an activity inside a service class. I have a following code:

public class SendLinkService extends Service {

@Override
public IBinder onBind(Intent intent) {
    // TODO Auto-generated method stub
    return null;
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    Bundle bundle = intent.getExtras();
    Intent shareIntent = new Intent(Intent.ACTION_SEND);
    shareIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    shareIntent.setType("text/plain");
    shareIntent.putExtra(Intent.EXTRA_TEXT, bundle.getString("URL"));
    getApplicationContext().startActivity(Intent.createChooser(shareIntent, "Share via"));
    return super.onStartCommand(intent, flags, startId);
}
}

It gives exception on following line of onStartCommand() :

getApplicationContext().startActivity(Intent.createChooser(shareIntent, "Share via"));
Vikalp
  • 2,051
  • 4
  • 18
  • 24
  • "I am trying to start an activity inside a service class" -- why does this service even exist? What value is this code adding by being in a service, rather than being in an activity? – CommonsWare Apr 20 '14 at 13:24

3 Answers3

37

Try this.

Intent shareIntent = new Intent(Intent.ACTION_SEND);
shareIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
shareIntent.setType("text/plain");
shareIntent.putExtra(Intent.EXTRA_TEXT, bundle.getString("URL"));
Intent new_intent = Intent.createChooser(shareIntent, "Share via");
new_intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
getApplicationContext().startActivity(new_intent);
Hariharan
  • 24,741
  • 6
  • 50
  • 54
  • 1
    For `(Build.VERSION.SDK_INT <= Build.VERSION_CODES.M) && (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P)` it is mandatory to add `Intent.FLAG_ACTIVITY_NEW_TASK` while calling `startActivity()` from outside of an `Activity` context. Docs - https://developer.android.com/preview/behavior-changes#fant-required – Hrishikesh Kadam Jun 13 '18 at 09:25
6

@hariharan answer works. However it also work without setting Intent.FLAG_ACTIVITY_NEW_TASK in the first case. More accurate answer is:

Intent shareIntent = new Intent(Intent.ACTION_SEND);
shareIntent.setType("text/plain");
shareIntent.putExtra(Intent.EXTRA_TEXT, bundle.getString("URL"));
Intent new_intent = Intent.createChooser(shareIntent, "Share via");
new_intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
getApplicationContext().startActivity(new_intent);
vedi
  • 400
  • 3
  • 17
2

For (Build.VERSION.SDK_INT <= Build.VERSION_CODES.M) || (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) it is mandatory to add Intent.FLAG_ACTIVITY_NEW_TASK while calling startActivity() from outside of an Activity context.

Docs

Intent shareIntent = new Intent(Intent.ACTION_SEND);
shareIntent.setType("text/plain");
shareIntent.putExtra(Intent.EXTRA_TEXT, bundle.getString("URL"));
Intent new_intent = Intent.createChooser(shareIntent, "Share via");
new_intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
getApplicationContext().startActivity(new_intent);
Hrishikesh Kadam
  • 35,376
  • 3
  • 26
  • 36