IntentReceiver не работает - PullRequest
       0

IntentReceiver не работает

2 голосов
/ 07 июля 2011

Я использую addProximityAlert:

Intent intent = new Intent(getString(R.string.intent_message_location_fetched));
PendingIntent proximityIntent = PendingIntent.getBroadcast(this, 0, intent, 0);
locationManager.addProximityAlert(LAT, LONG, RADIUS, 0, proximityIntent);

Как я понимаю, намерение с действием R.string.intent_message_location_fetched должно быть запущено после того, как местоположение будет около LAT LONG. (R.string.intent_message_location_fetched = com.myapp.client.MyActivity.LocationFetched)

Затем я пытаюсь создать класс BroadcastReceiver:

public class MyBroadcastReciver extends BroadcastReceiver {
    MyActivity mainActivity;
    public MyBroadcastReciver(MyActivity activity)
    {
        mainActivity = activity;
    }
    @Override
    public void onReceive(Context context, Intent intent) {
        mainActivity.ShowToast("Recived : " + intent.getAction());
    }
}

И зарегистрировать получателя в классе MyActivity:

public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);

        myReciver = new MyBroadcastReciver(this);
        IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(getString(R.string.intent_message_location_fetched));
        registerReceiver(myReciver, intentFilter);
...

Но ничего не происходит, когда я нахожусь в LAT LONG месте. В чем дело? Я попытался зарегистрировать Receiver в манифесте, но это не помогло.

P.S. Когда я использовал getActivity вместо getBroadcast, это работало нормально и восстанавливало мою активность, если она была мертва.

1 Ответ

1 голос
/ 11 июля 2011

ОК, ребята. Tnx в любом случае. Теперь я понимаю, как работает Интентс. Главное было (я так полагаю), что я использовал разные контексты.

Теперь у меня есть свой собственный класс с функцией addProximityAlert, вызываемой с помощью PendingIntent. Вместо этого я передаю WrapperContext ActivityContext (когда я создаю свой класс, я передаю образец своей Деятельности):

//Prepare proximity Intent
proximityIntent = new Intent(activityContext.getString(R.string.intent_message_location_fetched));
proximityPendingIntent = PendingIntent.getBroadcast(activityContext, 0, proximityIntent, 0);
locationManager.addProximityAlert(latitude, longitude, (float) radius, -1, proximityPendingIntent);

Обратите внимание на значение срока действия = -1! Или ваше намерение, вероятно, будет мертвым, прежде чем вы его поймаете.

Второе - я зарегистрировал фильтр намерений с action = "@ strings / my_message" в манифесте:

<activity ...>
            ...
        <intent-filter>
                <action android:name="@string/intent_message_location_fetched"/>
        </intent-filter>
</activity>

А потом у меня есть это в моем собственном конструкторе классов:

//Create and register receiver
        BroadcastReceiver mReceiver = new BroadcastReceiver() {

            @Override
            public void onReceive(Context context, Intent intent) {
                if(intent.getAction().equals(context.getString(R.string.intent_message_location_fetched)) 
                         && intent.getExtras().getBoolean(LocationManager.KEY_PROXIMITY_ENTERING))
                 {
                    Toast.makeText(activityContext, "LOCATION INTENT WORKS!", Toast.LENGTH_SHORT).show();
                 }
            }
        };
        activityContext.registerReceiver(mReceiver, new IntentFilter(activityContext.getString(R.string.intent_message_location_fetched)));

Надеюсь, это кому-нибудь пригодится.

...