2014-11-29 2 views
1

Задача состоит в том, чтобы как-то обработать «share» намерение в уже запущенном услуге.Отправлять «намерение долевого участия» (ACTION_SEND) от операции до обслуживания

Что касается ACTION_SEND - это действие, которое мы должны предпринять, чтобы забрать намерение в действии и передать его на службу.

Проблема заключается в том, что логически реализовать всю обработку «совместного использования» в сервисе и использовать деятельность только для целей трансляции.

Таким образом, служба должна получать намерение (которое ранее принималось и транслировалось по видам деятельности), поэтому мы можем позвонить ему getType() и get****Extra***(), чтобы узнать, что на самом деле было общим, и обработать эти данные каким-то образом.

Целью, которую мы получили в деятельности, является действие ACTION_SEND (или ACTION_SEND_MULTIPLE), правильно? Поэтому логически мы можем изменить действие с помощью вызова setAction() на объект намерения и передать его нашему сервису, который уже прослушивает это конкретное действие.

public class HandleShareIntentActivity extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     Intent intent = getIntent();  
     Intent broadcastIntent = new Intent(intent); 

     // If I initialize empty intent there is no problem, 
     // I'll receive it in service    
     // Intent broadcastIntent = new Intent(); 

     broadcastIntent.setAction(Constants.ACTION_SHARE); 
     broadcastIntent.setFlags(0); 
     sendBroadcast(broadcastIntent); 

     finish(); 
    } 
    // ... 
} 

Но это не работает, я не получаю это намерение в эксплуатации. Если я не копирую намерения, я получил и транслировал пустую, я получаю ее в своем сервисе.

Что я делаю неправильно?

ответ

2

Для начала отправьте сообщение startService(), а не sendBroadcast(). Нет причин, чтобы служба отвечала на трансляции, и вы добавляете проблемы безопасности в свое приложение, делая это.

Во-вторых, вам необходимо позвонить startService() по телефону Intent, который идентифицирует вашу услугу (например, new Intent(this, ThisIsTheService.class)). В вашем случае вы принимаете Intent, идентифицирующий активность, используя конструктор копирования, чтобы сделать его копию, изменив строку действия, а затем попытавшись ее использовать.

И, так как Intent является Parcelable, вы можете просто добавить его в качестве дополнительных к конкретной службы Intent:

startService(new Intent(this, ThisIsTheService.class).putExtra(EXTRA_SEND, getIntent())); 

и ваша служба может выбрать EXTRA_SEND в onHandleIntent() (если это IntentService) или onStartCommand() (если нет). Этот фрагмент кода предполагает, что вы определяете EXTRA_SEND как где-нибудь.

+2

Крысы, у меня был тот же ответ * почти * сделано, когда у вас появился :-) В любом случае, это правильный ответ, пожалуйста, примите его. – jjm

+0

Моя служба уже запущена, и она не должна отвечать на широковещательные передачи, просто для беспроблемного обработки данных. Причина, по которой я не запускаю службу каждый раз, когда я получаю событие общего доступа, потому что запущенная служба содержит данные, которые немного сложно инициализировать (служба запускается, когда внешнее хранилище USB связано с кабелем OTG, служебное чтение и анализ данных в соответствии с разделом файловой системы fat32 используя UsbDeviceConnection и bulkTransfer. Поэтому, когда я получаю намерение поделиться, я готов обработать его и, например, скопировать данные на usb. Если я инициализирую эти данные для каждого общего события, это займет немного времени). – nicolausYes

+0

Я понял, как это сделать с помощью startService. Можно ли это сделать с запуском службы? Могу ли я использовать sendBroadcast или использовать bindService? – nicolausYes

Смежные вопросы