Широковещательное намерение и IntentFilter в Android

Я пытаюсь передать намерение между двумя действиями.

Намерение отправляется из FilterActivity в PreviewActivity, как показано ниже.

final Intent ImageIntent = new Intent();
ImageIntent.setData(uri);
ImageIntent.setAction("com.test.FILTER_RENDERED");
sendBroadcast(ImageIntent);

В PreviewActivity мне нужно зарегистрировать приемник и использовать IntentFiter, чтобы поймать намерение и проверить его.

public class PreviewActivity extends Activity {

    ReceiveMessages myReceiver = null;
    Boolean myReceiverIsRegistered = false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        myReceiver = new ReceiveMessages();
        if (!myReceiverIsRegistered) {
            // registerReceiver(myReceiver, new IntentFilter());
            registerReceiver(myReceiver, new IntentFilter("com.test.FILTER_RENDERED"));

            myReceiverIsRegistered = true;
        }
     ....

    @Override
    protected void onResume(){
        super.onResume();
        if (!myReceiverIsRegistered) {
            registerReceiver(myReceiver, new IntentFilter("com.test.FILTER_RENDERED"));
            myReceiverIsRegistered = true;
        }
    }

    @Override
    protected void onStop() {
        super.onStop();
        if (myReceiverIsRegistered) {
            unregisterReceiver(myReceiver);
            myReceiverIsRegistered = false;
        }
    }


    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        Intent mNewIntent = intent;

        Bundle bundle = null;
        String fragment = null;
        if (intent != null) {
            mImagePreviewUri = mNewIntent.getData();
            if(mImagePreviewUri!=null) {
                mCameraActionsView.setEnabled(true);
                mImagePreview.setImageURI(mImagePreviewUri);
            }
        }
    }

    public class ReceiveMessages extends BroadcastReceiver
    {
        @Override
        public void onReceive(Context context, Intent intent)
        {
            String action = intent.getAction();
             if(action.equalsIgnoreCase("com.test.FILTER_RENDERED")){
                if (intent != null) {
                    mImagePreviewUri = intent.getData();
                    if(mImagePreviewUri!=null) {
                        mCameraActionsView.setEnabled(true);
                        mImagePreview.setImageURI(mImagePreviewUri);
                    }
                }
            }
        }
    }

}

К сожалению, намерение никогда не будет получено активностью‹

Любая идея, почему OnReceive не запускается?


person Seb    schedule 17.07.2015    source источник


Ответы (1)


Параметр конструктора IntentFilter предназначен для действия. Поэтому вы должны использовать ту же строку, что и в методе setAction вашего намерения.

Лучший способ сделать это без ошибок (например, опечаток) - определить константу где-нибудь (скажем, в классе констант):

public static final String YOUR_ACTION = "whaterver_you_want";

Затем используйте эту константу. Когда вы строите свое намерение:

intent.setAction(Constant.YOUR_ACTION);

И когда вы строите свой фильтр:

IntentFilter intentFilter = new IntentFilter(Constant.YOUR_ACTION);
person sonic    schedule 17.07.2015