使用 Action.SSEND 从另一个应用接收隐式意图时显示错误活动



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

该应用程序还具有通过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>

这是我的主活动.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不再收到任何关于进一步共享的新意图。但是,我的应用程序仍然以某种方式被带到前台。这让我非常困惑。

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

最新更新