我有一个包含两个活动的应用程序: 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 不再收到任何关于进一步分享的新意图。但是,我的应用程序仍然以某种方式被带到了前台。这让我很困惑。