Вопрос:
Я пытаюсь научиться использовать 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);}