4

у меня есть:Android - BroadcastReceiver не получает заказ намерения

MyApp расширяет приложение с OnCreate:

sendBroadcast(refreshAlarm); 

Log.d(TAG, "broadcast sent with intent " + refreshAlarm); 
Log.d(TAG, "onCreate"); 

где

static final Intent refreshAlarm = new Intent(ACTION_REFRESH_RECEIVER); 
public static final String ACTION_REFRESH_RECEIVER = "com.example.myapp.REFRESH_RECEIVER"; 

BroadcastReceiver:

package com.example.myapp; 

import android.app.AlarmManager; 
import android.app.PendingIntent; 
import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.preference.PreferenceManager; 
import android.util.Log; 

public class RefreshReceiver extends BroadcastReceiver 
{ 
    private static final String TAG = "RefreshReceiver"; 

    @Override 
    public void onReceive(Context context, Intent intent) 
    { 
     Log.d(TAG, "broadcast received with intent " + intent); 
     long interval = Long 
       .parseLong(PreferenceManager.getDefaultSharedPreferences(
         context).getString("delay", "900")) * 1000; 

     PendingIntent operation = PendingIntent.getService(context, -1, 
       new Intent(context, RefreshService.class), 
       PendingIntent.FLAG_UPDATE_CURRENT); 

     AlarmManager alarmManager = (AlarmManager) context 
       .getSystemService(Context.ALARM_SERVICE); 

     alarmManager.cancel(operation); 

     if (interval > 0) 
     { 
      alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, 
        System.currentTimeMillis(), interval, operation); 
     } 

     Log.d(TAG, "onReceive: delay = " + interval); 
    } 
} 

заявил в проявлении es:

<receiver android:name="com.example.myapp.RefreshReceiver" > 
    <intent-filter> 
     <action android:name="android.intent.action.BOOT_COMPLETED" /> 
     <action android:name="com.example.myapp.REFRESH_RECEIVER" /> 
    </intent-filter> 
</receiver> 

Мне кажется, что у меня есть все, что мне нужно для выполнения этой работы. Широковещательная передача отправляется в onCreate (я вижу, что в журнале действительно отправляется). Широковещательная передача объявляется с фильтром намерения, чтобы получить намерение refreshAlarm, но оно не получает его, и я не могу понять, почему. Нужно ли мне что-нибудь еще?

ответ

0

попытка зарегистрировать свой вещательный приемник по программно

public void registerBroadcastReceiver(View view) { 

    this.registerReceiver(broadCastReceiver, new IntentFilter(
      "com.example.myapp.REFRESH_RECEIVER")); 
    Toast.makeText(this, "Enabled broadcast receiver", Toast.LENGTH_SHORT) 
      .show(); 
} 

и разрегистрировать этим

 public void unregisterBroadcastReceiver(View view) { 

    this.unregisterReceiver(broadCastReceiver); 

    Toast.makeText(this, "Disabled broadcst receiver", Toast.LENGTH_SHORT) 
      .show(); 
} 
+0

Где я должен это делать? – kostek

+2

у вас код и метод registerbroadcast call from you oncrate activity и unregisterbrodcast в вашем методе уничтожения ... не регистрируйте его в вашем файле манифеста, а не файл манифеста, зарегистрируйте его внутри класса ... пожалуйста, обратитесь к документам .. –

+0

Я как могу получить 'broadCastReceiver'? – kostek

1

Вполне возможно, что он не работает, потому что ваш приемник и имя пакета используется для регистрации в вашем манифесте не совпадают.

Убедитесь, что ваше имя пакета соответствует вашему пакету для вашего ресивера.

+0

Я сделал копию-пасту и до сих пор ничего нового ... – kostek

3

если вы поставите BroadCastReceiver в mainfest.xml вам не нужно regiter его в код, зарегистрировать его в коде, только если вы создаете ее в ваш код

это пример здесь:

<receiver android:name="MyReceiver" > 
     <intent-filter> 
      <action android:name="android.mybroadcast" /> 
     </intent-filter> 
    </receiver> 

и здесь, чтобы вызвать его из файла класса,

Intent intent = new Intent(); 
intent.setAction("android.mybroadcast"); 
sendBroadcast(intent); 
+0

Это не сработало. Я полагаю, что это то, чем я занимаюсь: «static final Intent refreshAlarm = new Intent (ACTION_REFRESH_RECEIVER);' – kostek

+0

Я пробую код со мной, и это работает, если он не сработает с вами, вы можете опубликовать код активности (где вы отправляетеBroadCast) и полный mainfest.xml –

+0

Я делаю это в onCreate MyApp расширяет класс приложения (не Activity, возможно, это так). Я пытаюсь отправить трансляцию, когда приложение создано. – kostek

0

Вы сказали

MyApp расширяет вку

Вы должны зарегистрироваться MyApp в качестве приложения в андроид манифеста.

поставить эту строку в андроид манифеста приложения элемента

андроид: имя = "your.package.MyApp"

Где your.pacakage является пакет, в котором файл MyApp находится. Теперь ваш элемент приложения должен выглядеть следующим образом:

<application 
    android:name="your.package.MyApp" 
    android:allowBackup="true" 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/yourTheme" > 
0

У меня была та же проблема. Похоже, что зарегистрированные передатчики радиопередач работают только для действий системы. С моим пользовательским действием он работал только до тех пор, пока мое приложение было запущено (активность была в стеке активности).

Моим обходным путем является создание для него деятельности. Это не работает в фоновом режиме, однако это дает вам возможность захватывать события из других приложений.

<activity android:name=".ImportToProActivity"> 
     <intent-filter> 
      <action android:name="com.sourcecastle.logbook.ImportToProActivity"/> 

     </intent-filter> 
    </activity> 


Intent intent = new Intent(); 
intent.setComponent(new ComponentName("com.sourcecastle.freelogbook", "com.sourcecastle.logbook.ImportToProActivity")); 
startActivity(intent); 
Смежные вопросы