Установка android:launchMode="singleInstance"
на действие приведет к запуску только одного экземпляра этого действия. Это означает, что когда ваша деятельность была открыта один раз через Deeplink, этот экземпляр запущен. Когда вы открываете вторую ссылку, вы ожидаете, что ваш пользовательский интерфейс будет обновлен, но, поскольку экземпляр все еще выполнялся, onCreate
действия не вызывается, поэтому вы видите представления из более ранней ссылки. (Другой момент - когда для него установлен singleInstance не разрешать другие действия в стеке.)
Вы можете получить дополнительную информацию в официальных документах .
Теперь, хотя onCreate
никогда не вызывается, но Методы onResume
и onNewIntent
вызываются при установке singleInstance. Хотя обычно упоминается, что onNewIntent
работает с singleTop
, по моему опыту он вызывается при установке любого из трех отдельных флагов.
Таким образом, вам нужно переопределить любой из двух и написать код для обновления вашего интерфейса в них. Также обратите внимание, что onResume
вызывается, когда ваша деятельность создается в самый первый раз после onCreate
, поэтому, если вы поместите туда код, который вы можете оптимизировать, чтобы избежать повторной загрузки одной и той же вещи, и каждый раз вызывается onResume после возврата из фона. В этом случае onNewIntent()
кажется лучшим вариантом.
Надеюсь, что это вам помогло.
Обновление: По запросу Вы можете найти отредактированный код ниже
package app.freeairdrop.io;
import...
public class MainActivity extends Activity{
private ProgressBar progressBar;
private WebView webView;
private SwipeRefreshLayout mySwipeRefreshLayout;
private boolean mShouldPause;
@SuppressLint("SetJavaScriptEnabled")
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
progressBar = (ProgressBar) findViewById(R.id.progressBar);
progressBar.setMax(100);
webView = (WebView) findViewById(R.id.webView);
webView.setWebViewClient(new WebViewClientDemo());
webView.setWebChromeClient(new WebChromeClientDemo());
mySwipeRefreshLayout = (SwipeRefreshLayout) this.findViewById(R.id.swipeContainer);
mySwipeRefreshLayout.setOnRefreshListener(
new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
webView.reload();
mySwipeRefreshLayout.setRefreshing(false);
}
}
);
// call your method here to manage the intent
manageIntent(getIntent());
}
/* Simply moved your code which handles the intent to a common method
* Call this method from onCreate so that when first instance of activity gets created it handles it
* Similarly call it from onNewIntent to manage the new link you get
* You just need to pass the respective intents from the methods
*/
public void manageIntent(Intent intent) {
// ATTENTION: This was auto-generated to handle app links.
Intent appLinkIntent = intent;
String appLinkAction = appLinkIntent.getAction();
Uri appLinkData = appLinkIntent.getData();
if (getIntent().getExtras() != null) {
if (appLinkData == null){
webView.loadUrl("https://freeairdrop.io/");
}else
webView.loadUrl(String.valueOf(appLinkData));
} else if (getIntent().getExtras() == null){
webView.loadUrl("https://freeairdrop.io/");
}
}
// override to get the new intent when this activity has an instance already running
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
// again call the same method here with the new intent received
manageIntent(intent);
}
private class WebViewClientDemo extends WebViewClient {
@Override
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
super.onReceivedError(view, errorCode, description, failingUrl);
Toasty.error(getApplicationContext(), "No Internet, pull down to refresh when you're connected to internet", Toast.LENGTH_LONG, true).show();
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
Uri uri = Uri.parse(url);
if (uri.getHost() != null && (url.startsWith("https://freeairdrop.io/") || url.startsWith("https://www.freeairdrop.io/"))) {
return false;
}
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
view.getContext().startActivity(intent);
return true;
}
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
progressBar.setVisibility(View.GONE);
progressBar.setProgress(100);
}
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
progressBar.setVisibility(View.VISIBLE);
progressBar.setProgress(0);
}
}
private class WebChromeClientDemo extends WebChromeClient {
public void onProgressChanged(WebView view, int progress) {
progressBar.setProgress(progress);
}
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if ((keyCode == KeyEvent.KEYCODE_BACK) && webView.canGoBack()) {
webView.goBack();
return true;
}
else {
}
return super.onKeyDown(keyCode, event);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
return true;
}
@Override
// This method is used to detect back button
public void onBackPressed() {
if (this.webView.canGoBack()) {
this.webView.goBack();
return;
}
else {
// Let the system handle the back button
super.onBackPressed();
}
}
}
Посмотрите, работает ли это для вас, и дайте мне знать.