studio ejemplo android service broadcastreceiver

ejemplo - broadcastreceiver android studio



La intención del servicio debe ser explícita: intención (5)

Convierta la intención implícita en intención explícita y luego active el servicio de inicio.

Intent implicitIntent = new Intent(); implicitIntent.setAction("com.duk3r.eortologio2.MyService"); Context context = getApplicationContext(); Intent explicitIntent = convertImplicitIntentToExplicitIntent(implicitIntent, context); if(explicitIntent != null){ context.startService(explicitIntent); } public static Intent convertImplicitIntentToExplicitIntent(Intent implicitIntent, Context context) { PackageManager pm = context.getPackageManager(); List<ResolveInfo> resolveInfoList = pm.queryIntentServices(implicitIntent, 0); if (resolveInfoList == null || resolveInfoList.size() != 1) { return null; } ResolveInfo serviceInfo = resolveInfoList.get(0); ComponentName component = new ComponentName(serviceInfo.serviceInfo.packageName, serviceInfo.serviceInfo.name); Intent explicitIntent = new Intent(implicitIntent); explicitIntent.setComponent(component); return explicitIntent; }

Tengo una aplicación en algún momento en la que llamo a un servicio a través de un receptor de transmisión (MyStartupIntentReceiver). El código en el receptor de difusión para llamar al servicio es:

public void onReceive(Context context, Intent intent) { Intent serviceIntent = new Intent(); serviceIntent.setAction("com.duk3r.eortologio2.MyService"); context.startService(serviceIntent); }

El problema es que en Android 5.0 Lollipop me sale el siguiente error (en versiones anteriores de Android, todo funciona bien):

Unable to start receiver com.duk3r.eortologio2.MyStartupIntentReceiver: java.lang.IllegalArgumentException: Service Intent must be explicit: Intent { act=com.duk3r.eortologio2.MyService }

¿Qué debo cambiar para que el servicio se declare como explícito y se inicie normalmente? Intenté algunas respuestas en otros hilos similares, pero aunque me deshice del mensaje, el servicio no comenzó.


Establezca su packageName funciona.

intent.setPackage(this.getPackageName());


Mejoré la respuesta de Shahidul para eliminar la dependencia del contexto:

public class ServiceUtils { public static void startService(String intentUri) { Intent implicitIntent = new Intent(); implicitIntent.setAction(intentUri); Context context = SuperApplication.getContext(); Intent explicitIntent = convertImplicitIntentToExplicitIntent(implicitIntent, context); if(explicitIntent != null){ context.startService(explicitIntent); } } private static Intent convertImplicitIntentToExplicitIntent(Intent implicitIntent, Context context) { PackageManager pm = context.getPackageManager(); List<ResolveInfo> resolveInfoList = pm.queryIntentServices(implicitIntent, 0); if (resolveInfoList == null || resolveInfoList.size() != 1) { return null; } ResolveInfo serviceInfo = resolveInfoList.get(0); ComponentName component = new ComponentName(serviceInfo.serviceInfo.packageName, serviceInfo.serviceInfo.name); Intent explicitIntent = new Intent(implicitIntent); explicitIntent.setComponent(component); return explicitIntent; } }

Dentro de la clase SuperApplication:

public class SuperApplication extends Application { private static MyApp instance; public static SuperApplication getInstance() { return instance; } public static Context getContext(){ return instance; // or return instance.getApplicationContext(); } @Override public void onCreate() { instance = this; super.onCreate(); } }

En tu manifiesto:

<application android:name="com.example.app.SuperApplication " android:icon="@drawable/icon" android:label="@string/app_name" ....... <activity ......

Y luego, solo llame:

ServiceUtils.startService("com.myservice");


Prueba esto. esto funciona para mi. Aquí MonitoringService es mi clase de servicio. Tengo dos acciones, que indican el servicio para detener o iniciar. Envío ese valor desde mi receptor de difusión depende de AIRPLANE_MODE_CHANGED .

@Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if(Intent.ACTION_AIRPLANE_MODE_CHANGED.equalsIgnoreCase(action)){ boolean isOn = intent.getBooleanExtra("state", false); String serviceAction = isOn? MonitoringService.StopAction : MonitoringService.StartAction; Intent serviceIntent = new Intent(context, MonitoringService.class); serviceIntent.setAction(serviceAction); context.startService(serviceIntent); } }

NOTA: Agrego el siguiente código para activar mi receptor de transmisión llamado: ManageLocationListenerReceiver .

<receiver android:name=".ManageLocationListenerReceiver" android:enabled="true" android:exported="true"> <intent-filter> <action android:name="android.intent.action.AIRPLANE_MODE" /> </intent-filter> </receiver>


cualquier intento que haga a un servicio, actividad, etc. en su aplicación siempre debe seguir este formato

Intent serviceIntent = new Intent(context,MyService.class); context.startService(serviceIntent);

o

Intent bi = new Intent("com.android.vending.billing.InAppBillingService.BIND"); bi.setPackage("com.android.vending");

los intentos implícitos (lo que tiene actualmente en su código) se consideran un riesgo de seguridad