我遇到了问题,我绝不是一个专业,我将非常感谢我提供的任何帮助。
我建立了一个网站,该网站通过JS文件调用加密货币的现货价格。它托管在Web服务器上,并且可以在移动/桌面浏览器上完美运行。以下是该网址:http://mobi.cryptoptions.ie(将浏览器窗口的大小调整为移动大小)
接下来,我购买了此应用模板:https://codecanyon.net/item/web2app-quickest-featurerich-android-webview/8980493
将文档跟在T后面并构建了应用程序。将应用程序发布到我的Samsung s9 +,以查看其在本机上运行并正常运行!看起来很可爱。但是,一旦我从“多任务处理”中关闭该应用程序,然后重新启动该应用程序,则所有价格都不会呈现,并且“正在加载...”仍然存在。
为了重新获得价格,我必须完全卸载该应用程序并重新安装。
我将提供尽可能多的代码;如果有人需要了,请告诉我,我将其发布。
谢谢,谢谢!
App.java代码
package com.sherdle.webtoapp;
import android.content.Intent;
import android.net.Uri;
import android.support.multidex.MultiDexApplication;
import android.text.TextUtils;
import android.util.Log;
import com.google.android.gms.analytics.GoogleAnalytics;
import com.google.android.gms.analytics.Tracker;
import com.onesignal.OSNotificationOpenResult;
import com.onesignal.OneSignal;
import com.sherdle.webtoapp.activity.MainActivity;
import org.json.JSONObject;
public class App extends MultiDexApplication {
public static GoogleAnalytics analytics;
public static Tracker tracker;
private String push_url = null;
@Override public void onCreate() {
super.onCreate();
if (Config.ANALYTICS_ID.length() > 0) {
analytics = GoogleAnalytics.getInstance(this);
analytics.setLocalDispatchPeriod(1800);
tracker = analytics.newTracker(Config.ANALYTICS_ID); // Replace with actual tracker/property Id
tracker.enableExceptionReporting(true);
tracker.enableAdvertisingIdCollection(true);
tracker.enableAutoActivityTracking(true);
}
//OneSignal Push
if (!TextUtils.isEmpty(getString(R.string.onesignal_app_id)))
OneSignal.init(this, "REMOTE", getString(R.string.onesignal_app_id), new NotificationHandler());
}
// This fires when a notification is opened by tapping on it or one is received while the app is running.
private class NotificationHandler implements OneSignal.NotificationOpenedHandler {
// This fires when a notification is opened by tapping on it.
@Override
public void notificationOpened(OSNotificationOpenResult result) {
try {
JSONObject data = result.notification.payload.additionalData;
String webViewUrl = (data != null) ? data.optString("url", null) : null;
String browserUrl = result.notification.payload.launchURL;
if (webViewUrl != null || browserUrl != null) {
if (browserUrl != null || result.notification.isAppInFocus) {
browserUrl = (browserUrl == null) ? webViewUrl : browserUrl;
Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(browserUrl));
startActivity(browserIntent);
Log.v("INFO", "Received notification while app was on foreground or url for browser");
} else {
push_url = webViewUrl;
}
} else if (!result.notification.isAppInFocus) {
Intent mainIntent;
mainIntent = new Intent(App.this, MainActivity.class);
mainIntent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(mainIntent);
}
} catch (Throwable t) {
t.printStackTrace();
}
}
}
public synchronized String getPushUrl(){
String url = push_url;
push_url = null;
return url;
}
public synchronized void setPushUrl(String url){
this.push_url = url;
}
}
WebFragment.java
package com.sherdle.webtoapp.fragment;
import android.Manifest;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.os.Build;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.content.ContextCompat;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.app.AlertDialog;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.MimeTypeMap;
import android.webkit.URLUtil;
import android.webkit.WebSettings.PluginState;
import android.widget.FrameLayout;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
import com.sherdle.webtoapp.App;
import com.sherdle.webtoapp.Config;
import com.sherdle.webtoapp.util.GetFileInfo;
import com.sherdle.webtoapp.R;
import com.sherdle.webtoapp.widget.webview.WebToAppChromeClient;
import com.sherdle.webtoapp.widget.webview.WebToAppWebClient;
import com.sherdle.webtoapp.activity.MainActivity;
import com.sherdle.webtoapp.widget.AdvancedWebView;
import com.sherdle.webtoapp.widget.scrollable.ToolbarWebViewScrollListener;
import java.util.concurrent.ExecutionException;
public class WebFragment extends Fragment implements AdvancedWebView.Listener, SwipeRefreshLayout.OnRefreshListener{
//Layouts
public FrameLayout rl;
public AdvancedWebView browser;
public SwipeRefreshLayout swipeLayout;
public ProgressBar progressBar;
//WebView Clients
public WebToAppChromeClient chromeClient;
public WebToAppWebClient webClient;
//WebView Session
public String mainUrl = null;
static String URL = "url";
public int firstLoad = 0;
private boolean clearHistory = true;
public WebFragment() {
// Required empty public constructor
}
public static WebFragment newInstance(String url) {
WebFragment fragment = new WebFragment();
Bundle args = new Bundle();
args.putString(URL, url);
fragment.setArguments(args);
return fragment;
}
public void setBaseUrl(String url){
this.mainUrl = url;
this.clearHistory = true;
browser.loadUrl(mainUrl);
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null && mainUrl == null) {
mainUrl = getArguments().getString(URL);
firstLoad = 0;
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
rl = (FrameLayout) inflater.inflate(R.layout.fragment_observable_web_view, container,
false);
progressBar = (ProgressBar) rl.findViewById(R.id.progressbar);
browser = (AdvancedWebView) rl.findViewById(R.id.scrollable);
swipeLayout = (SwipeRefreshLayout) rl.findViewById(R.id.swipe_container);
return rl;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
if (Config.PULL_TO_REFRESH)
swipeLayout.setOnRefreshListener(this);
else
swipeLayout.setEnabled(false);
// Setting the webview listeners
browser.setListener(this, this);
// Setting the scroll listeners (if applicable)
if (MainActivity.getCollapsingActionBar()) {
((MainActivity) getActivity()).showToolbar(this);
browser.setOnScrollChangeListener(browser, new ToolbarWebViewScrollListener() {
@Override
public void onHide() {
((MainActivity) getActivity()).hideToolbar();
}
@Override
public void onShow() {
((MainActivity) getActivity()).showToolbar(WebFragment.this);
}
});
}
// set javascript and zoom and some other settings
browser.requestFocus();
browser.getSettings().setJavaScriptEnabled(true);
browser.getSettings().setBuiltInZoomControls(false);
browser.getSettings().setAppCacheEnabled(true);
browser.getSettings().setDatabaseEnabled(true);
browser.getSettings().setDomStorageEnabled(true);
// Below required for geolocation
browser.setGeolocationEnabled(true);
// 3RD party plugins (on older devices)
browser.getSettings().setPluginState(PluginState.ON);
if (Config.MULTI_WINDOWS) {
browser.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
browser.getSettings().setSupportMultipleWindows(true);
}
webClient = new WebToAppWebClient(this, browser);
browser.setWebViewClient(webClient);
chromeClient = new WebToAppChromeClient(this, rl, browser, swipeLayout, progressBar);
browser.setWebChromeClient(chromeClient);
// load url (if connection available
if (webClient.hasConnectivity(mainUrl, true)) {
String pushurl = ((App) getActivity().getApplication()).getPushUrl();
if (pushurl != null){
browser.loadUrl(pushurl);
} else {
browser.loadUrl(mainUrl);
}
} else {
try {
((MainActivity) getActivity()).hideSplash();
} catch (Exception e){
e.printStackTrace();
}
}
}
@Override
public void onRefresh() {
browser.reload();
}
@SuppressLint("NewApi")
@Override
public void onPause() {
super.onPause();
browser.onPause();
}
@Override
public void onDestroy() {
super.onDestroy();
browser.onDestroy();
}
@SuppressLint("NewApi")
@Override
public void onResume() {
super.onResume();
browser.onResume();
}
@SuppressLint("NewApi")
@Override
public void onDownloadRequested(String url, String userAgent, String contentDisposition, String mimetype, long contentLength) {
if (!hasPermissionToDownload(getActivity())) return;
String filename = null;
try {
filename = new GetFileInfo().execute(url).get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
if (filename == null) {
String fileExtenstion = MimeTypeMap.getFileExtensionFromUrl(url);
filename = URLUtil.guessFileName(url, null, fileExtenstion);
}
if (AdvancedWebView.handleDownload(getActivity(), url, filename)) {
Toast.makeText(getActivity(), getResources().getString(R.string.download_done), Toast.LENGTH_SHORT).show();
}
else {
Toast.makeText(getActivity(), getResources().getString(R.string.download_fail), Toast.LENGTH_SHORT).show();
}
}
private static boolean hasPermissionToDownload(final Activity context) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M ||
ContextCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE)
== PackageManager.PERMISSION_GRANTED )
return true;
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setMessage(R.string.download_permission_explaination);
builder.setPositiveButton(R.string.common_permission_grant, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
// Fire off an async request to actually get the permission
// This will show the standard permission request dialog UI
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
context.requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},1);
}
});
AlertDialog dialog = builder.create();
dialog.show();
return false;
}
@Override
public void onPageStarted(String url, Bitmap favicon) {
if (firstLoad == 0 && MainActivity.getCollapsingActionBar()){
((MainActivity) getActivity()).showToolbar(this);
firstLoad = 1;
} else if (firstLoad == 0){
firstLoad = 1;
}
}
@Override
public void onPageFinished(String url) {
if (!url.equals(mainUrl)
&& getActivity() != null
&& getActivity() instanceof MainActivity
&& Config.INTERSTITIAL_PAGE_LOAD)
((MainActivity) getActivity()).showInterstitial();
try {
((MainActivity) getActivity()).hideSplash();
} catch (Exception e){
e.printStackTrace();
}
if (clearHistory)
{
clearHistory = false;
browser.clearHistory();
}
hideErrorScreen();
}
@Override
public void onPageError(int errorCode, String description, String failingUrl) {
// TODO Auto-generated method stub
}
@Override
public void onExternalPageRequest(String url) {
// TODO Auto-generated method stub
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
browser.onActivityResult(requestCode, resultCode, data);
}
// sharing
public void shareURL() {
Intent shareIntent = new Intent(Intent.ACTION_SEND);
shareIntent.setType("text/plain");
String appName = getString(R.string.app_name);
shareIntent
.putExtra(
Intent.EXTRA_TEXT,
String.format(getString(R.string.share_body), browser.getTitle(), appName + " https://play.google.com/store/apps/details?id=" + getActivity().getPackageName()));
startActivity(Intent.createChooser(shareIntent,
getText(R.string.sharetitle)));
}
public void showErrorScreen(String message) {
final View stub = rl.findViewById(R.id.empty_view);
stub.setVisibility(View.VISIBLE);
((TextView) stub.findViewById(R.id.title)).setText(message);
stub.findViewById(R.id.retry_button).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (browser.getUrl() == null) {
browser.loadUrl(mainUrl);
} else {
browser.loadUrl("javascript:document.open();document.close();");
browser.reload();
}
}
});
}
public void hideErrorScreen(){
final View stub = rl.findViewById(R.id.empty_view);
if (stub.getVisibility() == View.VISIBLE)
stub.setVisibility(View.GONE);
}
}
Config.java
package com.sherdle.webtoapp;
public class Config {
/**
* MAIN SETTINGS
*/
//Set to true to use a drawer, or to false to use tabs (or neither)
public static boolean USE_DRAWER = true;
//Set to true if you would like to hide the actionbar at all times
public static boolean HIDE_ACTIONBAR = false;
//Set to true if you would like to display a splash screen on boot. Drawable shown is 'vert_loading'
public static boolean SPLASH = true;
//Set to true if you would like to hide the tabs. Only applies is USE_DRAWER is false & if you have more then 1 tab
public static boolean HIDE_TABS = false;
//Set to true if you would like to enable pull to refresh
public static boolean PULL_TO_REFRESH = true;
//Set to true if you would like to hide the actionbar on when scrolling down. Only applies if HIDE_ACTIONBAR is false
public static boolean COLLAPSING_ACTIONBAR = false;
//Set to true if you would like to use the round 'pull to refresh style' loading indicator instead of a progress bar
public static boolean LOAD_AS_PULL = true;
//Set to true if you want to use a light toolbar
public static boolean LIGHT_TOOLBAR_THEME = false;
/**
* URL / LIST OF URLS
*/
//The titles of your web items
public static final Object[] TITLES = new Object[]{"CryptOptions"};
//The URL's of your web items
public static final String[] URLS = new String[]{"http://mobi.cryptoptions.ie/"};
//The icons of your web items
public static final int[] ICONS = new int[]{R.drawable.d135677436};
/**
* IDS
*/
//If you would like to use analytics, you can enter an analytics ID here
public static String ANALYTICS_ID = "";
//OneSignal and Admob IDs have to be configured in Strings.xml
/**
* ADVANCED SETTINGS
*/
//All urls that should always be opened outside the WebView and in the browser, download manager, or their respective app
public static final String[] OPEN_OUTSIDE_WEBVIEW = new String[]{"market://", "play.google.com", "plus.google.com", "mailto:", "tel:", "vid:", "geo:", "whatsapp:", "sms:", "intent://"};
//Defines a set of urls/patterns that should exlusively load inside the webview. All other urls are loaded outside the WebView. Ignored if no urls are defined.
public static final String[] OPEN_ALL_OUTSIDE_EXCEPT = new String[]{};
//Set to true if you would like to hide the drawer header. (requires USE_DRAWER)
public static boolean HIDE_DRAWER_HEADER =false;
//Set to true if you would like to hide navigation in the toolbar (i.e. back, forward)
public static boolean HIDE_MENU_NAVIGATION = false;
//Set to true if you would like to sharing in the toolbar
public static boolean HIDE_MENU_SHARE = false;
//Set to true if you would like to hide the home button
public static boolean HIDE_MENU_HOME = true;
//Set to true if you would like to show a link to the apps notification settings
public static boolean SHOW_NOTIFICATION_SETTINGS = true;
//Set to true if you would like to support popup windows, e.g. for Facebook login
public static boolean MULTI_WINDOWS = false;
//If you would like to show the splash screen for an additional amount of time after page load, define it here (MS)
public static int SPLASH_SCREEN_DELAY = 0;
//Permissions required to use the app (should also be in manifest.xml)
public static String[] PERMISSIONS_REQUIRED = new String[]{}; //Manifest.permission.PERMISSION_NAME
//Always use the app name as actionbar title (only applies for if USE_DRAWER is false and number of tabs == 1)
public static boolean STATIC_TOOLBAR_TITLE = false;
//Load a webpage when no internet connection was found (must be in assets). Leave empty to show dialog.
public static String NO_CONNECTION_PAGE = "";
//The image/icon used for in the drawer header (use R.mipmap.ic_launcher to show centered app icon)
public static int DRAWER_ICON = R.drawable.vert_loading;
//The image/icon used for the toolbar
public static int TOOLBAR_ICON = R.drawable.d1575488684;
//Show interstitials when browsing web pages (or only during drawer/tab navigation)
public static final boolean INTERSTITIAL_PAGE_LOAD = true;
//The frequency in which interstitial ads are shown
public static final int INTERSTITIAL_INTERVAL = 2;
}