1

我有一个包含两个活动的应用程序: MainActivity,其中包含一个 URL 输入字段,用户可以在其中输入 YouTube 视频 URL 并按下提交按钮,以启动第二个活动 VideoActivity,它显示有关此视频的一些信息(从另一个网络服务器)。

该应用程序还具有通过 Youtube 应用程序接收意图的功能。当用户在 Youtube 应用程序中按下分享按钮时,我的应用程序会出现在分享列表中。在 Youtube 应用中按下分享后,MainActivity 应该被带到前面,并且 URL 应该发布在 MainActivity 的 URL 字段中。

但是,这仅在第一次共享时正确发生。如果当用户从 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 不再收到任何关于进一步分享的新意图。但是,我的应用程序仍然以某种方式被带到了前台。这让我很困惑。

4

1 回答 1

0

当您从另一个应用程序共享时,您的应用程序MainActivity会被带到前面并被onNewIntent()调用。您不会覆盖onNewIntent(),因此您永远不会看到 share Intent

于 2018-10-08T13:20:38.630 回答