Неправильная активность отображается при получении неявного намерения от другого приложения с помощью Action.SEND - PullRequest
0 голосов
/ 07 октября 2018

У меня есть приложение с двумя действиями: MainActivity, которое содержит поле ввода URL-адреса, где пользователь может ввести URL-адрес видео YouTube и нажать кнопку отправки, чтобы запустить второе действие VideoActivity, которое отображает некоторую информацию об этом видео (извлекается с другого веб-сервера).

Приложение также имеет функцию получения намерений через приложение Youtube.Когда пользователь нажимает кнопку «Поделиться» в приложении Youtube, мое приложение появляется в списке «Поделиться».После нажатия кнопки «Поделиться» в приложении Youtube, MainActivity следует перевести на передний план, а URL-адрес должен быть размещен в поле URL-адреса MainActivity.

Однако это верно только для первого общего ресурса.Если приложение находится в фоновом режиме, когда пользователь делится с приложением Youtube, его перенаправляют на любое последнее видимое действие, будь то MainActivity или VideoActivity (и даже если это MainActivity, URL-адрес не публикуется в поле URL-адреса,но поле остается в том же состоянии, в котором оно было, когда приложение было в последний раз видно).

Вот мой текущий AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.youcmt.youdmcapp">
    <uses-permission android:name="android.permission.INTERNET"/>
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

        <activity android:name=".MainActivity"
                  android:launchMode="singleTop">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
            <intent-filter>
                <action android:name="android.intent.action.SEND"/>
                <category android:name="android.intent.category.DEFAULT"/>
                <data android:mimeType="text/plain"/>
            </intent-filter>
        </activity>
        <activity
            android:name=".VideoActivity"
            android:parentActivityName=".MainActivity"/>
        <service
            android:name=".FetchVideoService"
            android:exported="false"/>
    </application>

</manifest>

Вот мой код MainActivity.java:

    public class MainActivity extends AppCompatActivity {
        private ResponseReceiver mReceiver;
        private EditText mUrlEditText;
        private Button mSearchButton;
        private ProgressBar mProgressBar;

        @Override
        protected void onCreate(Bundle savedInstanceState) {

            setContentView(R.layout.activity_main);
            super.onCreate(savedInstanceState);
            mUrlEditText = findViewById(R.id.url_search_et);
            Intent intent = getIntent();
            if (intent.getType()!=null &&
                    intent.getType().equals("text/plain")) {
                Bundle extras = getIntent().getExtras();
                String value = extras.getString(Intent.EXTRA_TEXT);
                if(value!=null)
                {
                    mUrlEditText.setText(value);
                }
            }
            mProgressBar = findViewById(R.id.progress_bar);
            mSearchButton = findViewById(R.id.search_button);
            mSearchButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    try {
                        askForVideo(mUrlEditText.getText().toString());
                        mSearchButton.setVisibility(View.INVISIBLE);
                        mProgressBar.setVisibility(View.VISIBLE);
                    } catch (Exception e) {
                        mUrlEditText.setText("");
                        mUrlEditText.setHint(e.getMessage());
                        e.printStackTrace();
                    }
                }
            });
        }

        @Override
        protected void onResume() {
            super.onResume();
            //register the ResponseReceiver
            mReceiver = new ResponseReceiver();
            IntentFilter intentFilter = new IntentFilter();
            intentFilter.addAction(FETCH_VIDEO_INFO);
            registerReceiver(mReceiver, intentFilter);
        }

        private void askForVideo (String url) throws Exception {

            try {
                Intent intent = FetchVideoService.newIntent(this, url);
                startService(intent);
            } catch (Exception e) {
                mUrlEditText.setText(e.getMessage());
            }
        }

    public class ResponseReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            int status = intent.getIntExtra(EXTRA_VIDEO_STATUS, FAIL);
            mProgressBar.setVisibility(View.INVISIBLE);
            mSearchButton.setVisibility(View.VISIBLE);
            if(status==FAIL)
            {
                mUrlEditText.setText("");
                mUrlEditText.setHint("Error retrieving video!");
            }
            else if(status==SUCCESS) {
                Video video = intent.getParcelableExtra(EXTRA_VIDEO);
                Intent videoActivityIntent = 
 VideoActivity.newIntent(getApplicationContext(), video);
                startActivity(videoActivityIntent);
            }
        }
    }

    @Override
    protected void onPause() {
        unregisterReceiver(mReceiver);
        super.onPause();
    }
}

Я не думаю, что какие-либо другие файлы будут полезны для понимания проблемы.Хотя многим создателям приложений приходится иметь дело с этим, я не могу найти ответы на эту проблему.Пожалуйста, прокомментируйте, если считаете, что мне нужно добавить дополнительную информацию, и заранее благодарю за любую помощь!

Обновление: тестирование показывает, что после первого использования «Поделиться» с YouTube (и с учетом того, что приложение остается в фоновом режиме), MainActivity больше не получает никаких новых намерений о дальнейших акциях.Тем не менее, мое приложение как-то вышло на первый план.Это очень смущает меня.

1 Ответ

0 голосов
/ 08 октября 2018

Когда вы делитесь из другого приложения, ваш MainActivity переносится на передний план, и на нем вызывается onNewIntent().Вы не переопределяете onNewIntent(), поэтому вы никогда не увидите долю Intent.

...