Почему мой BroadcastReceiver не работает?

Вопрос: Я пытаюсь научиться использовать Android BroadcasReceiver. Я написал этот код, но он не работает... Я попытался, например, изменить время и т.д. Что это неправильно? Я добавил в манифесте: Мой простой BroadcasReceiver: public class Broadcast extends BroadcastReceiver { @Override

Вопрос:

Я пытаюсь научиться использовать Android BroadcasReceiver. Я написал этот код, но он не работает… Я попытался, например, изменить время и т.д. Что это неправильно?

Я добавил в манифесте:

<receiver android:name=»com.example.broadcastreceiverspike.Broadcast» > <intent-filter android:priority=»100″> <action android:name=»android.intent.action.ACTION_SCREEN_ON» /> <action android:name=»android.intent.action.ACTION_SCREEN_OFF» /> <action android:name=»android.intent.action.TIME_SET» /> </intent-filter> </receiver>

Мой простой BroadcasReceiver:

public class Broadcast extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Log.d(«BROADCAST», «It worked»); Toast.makeText(context, «BROADCAST», Toast.LENGTH_LONG).show(); } }

Моя основная деятельность (основная деятельность по умолчанию)

public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } } Лучший ответ:

Я решил!

“В отличие от других широко распространенных намерений, для Intent.ACTION_SCREEN_OFF и Intent.ACTION_SCREEN_ON вы НЕ МОЖЕТЕ объявить их в своем манифесте Android! Я точно не знаю, почему, но они должны быть зарегистрированы в IntentFilter в вашем JAVA-коде”

http://thinkandroid.wordpress.com/2010/01/24/handling-screen-off-and-screen-on-intents/

манифест

<receiver android:name=».Broadcast» > <intent-filter> <action android:name=»android.intent.action.TIME_SET» /> </intent-filter> </receiver>

Основной класс деятельности

открытый класс MainActivity расширяет действие {

@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // INITIALIZE RECEIVER IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON); filter.addAction(Intent.ACTION_SCREEN_OFF); BroadcastReceiver mReceiver = new Broadcast(); registerReceiver(mReceiver, filter); }

}

Мой радиоприемник

публичный класс Broadcast расширяет BroadcastReceiver {

public static String TAG = «BROADCAST»; @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(Intent.ACTION_TIME_CHANGED)) { Log.d(TAG, «BROADCAST Cambio di orario»); Toast.makeText(context, «BROADCAST Cambio di orario», Toast.LENGTH_LONG).show(); } else if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) { // DO WHATEVER YOU NEED TO DO HERE Log.d(TAG, «BROADCAST Screen OFF»); Toast.makeText(context, «Screen OFF», Toast.LENGTH_LONG).show(); } else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) { // AND DO WHATEVER YOU NEED TO DO HERE Log.d(TAG, «BROADCAST Screen ON»); Toast.makeText(context, «BROADCAST Screen ON», Toast.LENGTH_LONG).show(); } }

}

Ответ №1

Ознакомьтесь с этим руководством по вещательным приемникам.

Обновление: я не уверен, что вы используете этот учебник, потому что в этом учебнике есть много полезного материала, например:

@Override public void onResume() { super.onResume(); // Register mMessageReceiver to receive messages. LocalBroadcastManager.getInstance(this).registerReceiver(mMessageReceiver, new IntentFilter(«my-event»)); } // handler for received Intents for the «my-event» event private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { // Extract data included in the Intent String message = intent.getStringExtra(«message»); Log.d(«receiver», «Got message: » + message); } }; @Override protected void onPause() { // Unregister since the activity is not visible LocalBroadcastManager.getInstance(this).unregisterReceiver(mMessageReceiver); super.onPause(); }

Другими словами, вы создали собственный broadcast receiver class, но вы его не использовали.

И также, пожалуйста, проверьте это.

Ответ №2

Вы добавили необходимые предложения?

use-permission android: name = “android.permission.READ_PHONE_STATE”

Это приемник для обработки, когда экран выключен или включен или заблокирован:

public class ScreenReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) { } else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) { } else if(intent.getAction().equals(Intent.ACTION_USER_PRESENT)) { } }

} это манифест:

<receiver android:name=».ScreenReceiver»> <intent-filter> <action android:name=»android.intent.action.USER_PRESENT» /> <action android:name=»android.intent.action.SCREEN_OFF» /> <action android:name=»android.intent.action.SCREEN_ON» /> </intent-filter> </receiver> Ответ №3

У меня была та же проблема, и я ее исправил (проверен на 4.3 и 5.1). Я мог объявить “android.intent.action.USER_PRESENT” внутри манифеста, если у вас есть разрешение READ_PHONE_STATE, это нормально! Мое мини-приложение состоит из широковещательного приемника, который реагирует на состояние ВКЛ/ВЫКЛ экрана и запускает фоновый сервис, который обеспечивает непрерывное распознавание голоса. Если экран выключен, распознавание отключается. Вот код, наслаждайтесь: МАНИФЕСТ:

<uses-permission android:name=»android.permission.READ_PHONE_STATE»/> <receiver android:name=»classes.VoiceLaunchReceiver» > <intent-filter> <action android:name=»android.intent.action.USER_PRESENT» /> <action android:name=»android.intent.action.BOOT_COMPLETED» /> <category android:name=»android.intent.category.DEFAULT» /> </intent-filter> </receiver>

ПРИЕМНИК ВЕЩАНИЯ:

public class VoiceLaunchReceiver extends BroadcastReceiver { @Override public void onReceive(Context ctx, Intent intent) { Intent service = new Intent(ctx, VoiceLaunchService.class); // service.putExtra(action, true); Log.i(«joscsr»,»Incoming Voice Launch Broadcast…»); if (intent.getAction().equals(Intent.ACTION_USER_PRESENT)) { Log.i(«joshcsr», «************nCSR Resumed (BC)n************»); ctx.startService(service); } if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) { Log.i(«joshcsr», «************nCSR STOPPED by SCREEN (BC)n************»); ctx.stopService(service); } } }

Как вы можете себе представить, мой приемник USER_PRESENT не зарегистрирован нигде. Я регистрирую ACTION_SCREEN_OFF и ON в методе onCreate моей службы, который был вызван моим получателем.

@Override public void onCreate() { super.onCreate(); //Register screen ON/OFF BroadCast launcher=new VoiceLaunchReceiver(); IntentFilter i=new IntentFilter(Intent.ACTION_SCREEN_OFF); i.addAction(Intent.ACTION_SCREEN_ON); registerReceiver(launcher,i); Log.d(«joshcsr»,»VoiceLaunch Service CREATED»); }

Наконец, я отменил регистрацию экрана в on-off в onDestroy() моей службы:

@Override public void onDestroy() { super.onDestroy(); unregisterReceiver(launcher);}

Оцените статью
Добавить комментарий