Notice
Recent Posts
Recent Comments
Link
투케이2K
14. (TWOK/UTIL) [Android/Java] A_Main - 웹뷰 로드 화면 관련 클래스 정리 본문
[설 명]
프로그램 : Android / Java
설 명 : 웹뷰 로드 화면 관련 클래스 정리
[A_Main : 소스 코드]
package com.example.testapp;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.ActivityNotFoundException;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.http.SslError;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.os.RemoteException;
import android.os.SystemClock;
import android.provider.MediaStore;
import android.util.Log;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
import android.view.Window;
import android.webkit.ConsoleMessage;
import android.webkit.CookieManager;
import android.webkit.CookieSyncManager;
import android.webkit.HttpAuthHandler;
import android.webkit.JavascriptInterface;
import android.webkit.SslErrorHandler;
import android.webkit.ValueCallback;
import android.webkit.WebChromeClient;
import android.webkit.WebResourceRequest;
import android.webkit.WebResourceResponse;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.Toast;
import org.json.JSONArray;
import org.json.JSONObject;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
public class A_Main extends AppCompatActivity {
/**
* TODO [클래스 설명]
* // -----------------------------------------
* 1. 사용하는 레이아웃 : a_main_layout
* 2. 메인 웹뷰 화면 호출 액티비티 화면
* // -----------------------------------------
* */
// TODO [빠른 로직 찾기 : 주석 로직 찾기]
/**
* // -----------------------------------------
* // [SEARCH FAST] : [프로세스 종료 이벤트 감지]
* // [SEARCH FAST] : [메인 웹뷰 포그라운드 푸시 알림 JS 전달]
* // [SEARCH FAST] : [퍼미션 권한 부여 확인 실시]
* // [SEARCH FAST] : [저장된 프리퍼런스 데이터 확인]
* // [SEARCH FAST] : [네트워크 활성 상태 체크 실시]
* // [SEARCH FAST] : [웹뷰 로드 수행 실시]
* // [SEARCH FAST] : [인트로 화면 처리]
* // [SEARCH FAST] : [자바스크립트 통신]
* // [SEARCH FAST] : [프리퍼런스 데이터 초기화]
* // [SEARCH FAST] : [파이어베이스 토큰 값 저장]
* // [SEARCH FAST] : [앱 라이프 사이클 시간 저장]
* // -----------------------------------------
*/
// TODO [웹뷰 전역 변수 선언 부분]
static WebView main_webview; // [웹뷰 컴포넌트]
Handler js_handler = new Handler(); // [자바스크립트 통신 사용 핸들러]
ValueCallback mFilePathCallback; // [파일 업로드 수행]
// TODO [일반 전역 변수 선언 부분]
ImageView introBgImageView; // [웹뷰 로딩 동안 표시할 이미지]
private static final String ACTIVITY_NAME = "A_Main";
private long backTime = 0; // [뒤로가기 버튼 클릭 시간 저장]
// TODO [액티비티 생명 주기 상태 체크 메소드]
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
try {
// [타이틀바 없애기 : FEATURE_NO_TITLE]
requestWindowFeature(Window.FEATURE_NO_TITLE);
}
catch (Exception e){
e.printStackTrace();
}
// [액티비티 레이아웃 지정 실시]
setContentView(R.layout.a_main_layout);
Log.i("---","---");
Log.d("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onCreate() :: 액티비티 수행 실시]");
Log.d("//===========//","================================================");
Log.i("---","---");
// -----------------------------------------
// TODO [SEARCH FAST] : [파이어베이스 토큰 값 저장]
/*
try {
// [파이어베이스 토큰 확인]
FirebaseInstanceId.getInstance().getInstanceId()
.addOnSuccessListener(new OnSuccessListener<InstanceIdResult>() {
@Override
public void onSuccess(InstanceIdResult instanceIdResult) {
String deviceToken = String.valueOf(instanceIdResult.getToken());
if (deviceToken != null && deviceToken.length()>0
&& !deviceToken.trim().equals("") && !deviceToken.trim().contains("null")){
Log.i("---","---");
Log.w("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onCreate() :: FirebaseInstanceId :: 파이어베이스 토큰 확인 실시]");
Log.i("","\n"+"[타 입 :: onSuccess]");
Log.i("","\n"+"[토 큰 :: "+String.valueOf(deviceToken)+"]");
Log.i("","\n"+"[결 과 :: 푸시 토큰 값 확인 성공]");
Log.w("//===========//","================================================");
Log.i("---","---");
// [프리퍼런스에 토큰값 저장 수행 실시]
S_Preference.setString(getApplication(), S_FinalData.PRE_PUSH_TOKEN, String.valueOf(deviceToken));
S_Preference.setString(getApplication(), S_FinalData.PRE_PUSH_TOKEN, String.valueOf(deviceToken));
}
else {
Log.i("---","---");
Log.e("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onCreate() :: FirebaseInstanceId :: 파이어베이스 토큰 확인 실시]");
Log.i("","\n"+"[타 입 :: onSuccess]");
Log.i("","\n"+"[토 큰 :: "+String.valueOf(deviceToken)+"]");
Log.i("","\n"+"[결 과 :: 푸시 토큰 값 확인 에러]");
Log.e("//===========//","================================================");
Log.i("---","---");
}
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Log.i("---","---");
Log.e("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onCreate() :: FirebaseInstanceId :: 파이어베이스 토큰 확인 실시]");
Log.i("","\n"+"[타 입 :: onFailure]");
Log.i("","\n"+"[토 큰 :: "+String.valueOf(e.getMessage())+"]");
Log.i("","\n"+"[결 과 :: 푸시 토큰 값 확인 에러]");
Log.e("//===========//","================================================");
Log.i("---","---");
}
})
.addOnCompleteListener(new OnCompleteListener<InstanceIdResult>() {
@Override
public void onComplete(@NonNull Task<InstanceIdResult> task) {
Log.i("---","---");
Log.d("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onCreate() :: FirebaseInstanceId :: 파이어베이스 토큰 확인 실시]");
Log.i("","\n"+"[타 입 :: onComplete]");
Log.i("","\n"+"[성공 여부 :: "+String.valueOf(task.isSuccessful())+"]");
Log.d("//===========//","================================================");
Log.i("---","---");
}
});
}
catch (Exception e){
e.printStackTrace();
}
// */
// -----------------------------------------
// -----------------------------------------
// TODO [SEARCH FAST] : [프로세스 종료 이벤트 감지]
try {
// [사용자가 최근 앱 작업 목록에서 지우기 및 날림 감지]
startService(new Intent(getApplication(), S_ProgramTaskService.class));
}
catch (Exception e){
//e.printStackTrace();
}
// -----------------------------------------
// -----------------------------------------
// TODO [SEARCH FAST] : [메인 웹뷰 포그라운드 푸시 알림 JS 전달]
S_Preference.setString(getApplication(), S_FinalData.PRE_ROOT_ACTIVITY, "RUN");
// -----------------------------------------
// -----------------------------------------
// TODO [이미지 뷰 : 로딩 화면 : 컴포넌트 객체 선언 실시]
introBgImageView = (ImageView) findViewById(R.id.introBgImageView);
// -----------------------------------------
// -----------------------------------------
// TODO [SEARCH FAST] : [저장된 프리퍼런스 데이터 확인]
String deviceMoco = String.valueOf(S_DeviceID.getDeviceID(A_Main.this));
S_Preference.setString(getApplication(), S_FinalData.PRE_MOBILE_MOCO, deviceMoco); // [디바이스 고유값 저장]
S_Preference.setString(getApplication(), S_FinalData.PRE_MOBILE_MOCO, deviceMoco); // [디바이스 고유값 저장]
Log.i("---","---");
Log.w("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onCreate() :: 사전 저장된 프리퍼런스 데이터 확인]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[univ :: [학교 구분] :: "+String.valueOf(S_Preference.getString(getApplication(), S_FinalData.PRE_USER_UNIV))+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[uid :: [사용자 학번] :: "+String.valueOf(S_Preference.getString(getApplication(), S_FinalData.PRE_USER_UID))+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[upw :: [사용자 비번] :: "+String.valueOf(S_Preference.getString(getApplication(), S_FinalData.PRE_USER_UPW))+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[iddi :: [사용자 신분] :: "+String.valueOf(S_Preference.getString(getApplication(), S_FinalData.PRE_USER_IDDI))+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[autoLogin :: [자동 로그인] :: "+String.valueOf(S_Preference.getString(getApplication(), S_FinalData.PRE_AUTO_LOGIN))+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[picture :: [사용자 사진 표시] :: "+String.valueOf(S_Preference.getString(getApplication(), S_FinalData.PRE_USER_PICTURE))+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[shake :: [흔들기 이벤트] :: "+String.valueOf(S_Preference.getString(getApplication(), S_FinalData.PRE_MOBILE_SHAKE))+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[plat :: [플랫폼] :: "+String.valueOf(S_FinalData.PRE_MOBILE_PLAT)+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[moco :: [디바이스 고유값] :: "+String.valueOf(S_Preference.getString(getApplication(), S_FinalData.PRE_MOBILE_MOCO))+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[version :: [앱 버전] :: "+String.valueOf(S_Preference.getString(getApplication(), S_FinalData.PRE_MOBILE_VERSION))+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[code :: [앱 코드] :: "+String.valueOf(S_Preference.getString(getApplication(), S_FinalData.PRE_MOBILE_CODE))+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[token [푸시 토큰] :: "+String.valueOf(S_Preference.getString(getApplication(), S_FinalData.PRE_PUSH_TOKEN))+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[loginScheme :: [로그인 스키마 데이터] :: "+String.valueOf(S_Preference.getString(getApplication(), S_FinalData.PRE_SCHEME_DATA_LOGIN))+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[callScheme :: [일반 스키마 데이터] :: "+String.valueOf(S_Preference.getString(getApplication(), S_FinalData.PRE_SCHEME_DATA_CALL))+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[PRE_APP_UPDT_TIME :: [앱 재구동 시간 [분 단위]] :: "+String.valueOf(S_Preference.getString(getApplication(), S_FinalData.PRE_APP_UPDT_TIME))+"]");
Log.w("//===========//","================================================");
Log.i("---","---");
/*
// TODO [스키마 데이터 확인]
C_Ui_View.showAlert(
A_Main.this,
0,
"[스키마 및 숏컷 접속 확인]",
"로그인 스키마 데이터 : " + S_Preference.getString(getApplication(), S_FinalData.PRE_SCHEME_DATA_LOGIN) + "\n"
+ "일반 스키마 데이터 : " + S_Preference.getString(getApplication(), S_FinalData.PRE_SCHEME_DATA_CALL) + "\n",
"확인",
"",
""
);
// */
// -----------------------------------------
// -----------------------------------------
// TODO [SEARCH FAST] : [네트워크 활성 상태 체크 실시]
if (C_StateCheck.getWhatOfNetwork(A_Main.this)){ // [네트워크가 연결된 경우]
// [SEARCH FAST] : [웹뷰 로드 수행 실시]
init_WebView(S_FinalData.WV_LOAD_MAIN_ENZ_URL);
}
else { // [네트워크가 연결 되지 않은 경우]
// [팝업창 호출 실시 및 와이파이 설정창 이동]
C_Ui_View.showAlert(
A_Main.this,
1, // [와이파이 설정창 이동 코드]
S_FinalData.AL_TITLE,
S_FinalData.AL_NET + " [" +String.valueOf(ACTIVITY_NAME)+ "]",
S_FinalData.AL_SET,
S_FinalData.AL_NO,
"");
}
// -----------------------------------------
// -----------------------------------------
// TODO [퍼미션 권한 부여 확인 실시]
C_Permission.checkPermission(A_Main.this);
// -----------------------------------------
} // TODO [메인 종료]
// TODO [SEARCH FAST] : [웹뷰 로드 수행 실시]
public void init_WebView(String url) {
Log.i("---","---");
Log.w("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> init_WebView() :: 웹뷰 초기 값 설정 및 웹뷰 로드 수행 실시]");
Log.i("","\n"+"[url :: "+String.valueOf(url)+"]");
Log.w("//===========//","================================================");
Log.i("---","---");
try {
// -----------------------------------------
// TODO [WebView 컴포넌트 매핑 설정]
main_webview = (WebView)findViewById(R.id.main_webview);
// -----------------------------------------
// -----------------------------------------
// TODO [웹뷰 쿠키 및 세션 관리를 위한 쿠키 매니저 선언]
CookieManager cookieManager = CookieManager.getInstance();
// -----------------------------------------
// -----------------------------------------
// TODO [웹뷰의 캐시를 초기화 실시 : 일반 적용 방법]
try {
main_webview.clearCache(true);
main_webview.clearHistory();
main_webview.clearView();
}
catch (Exception e){
//e.printStackTrace();
}
// -----------------------------------------
// -----------------------------------------
///*
// TODO [웹뷰의 캐시를 초기화 실시 : 쿠키 매니저를 통한 캐시 제거]
try {
cookieManager.removeSessionCookies(new ValueCallback<Boolean>() {
@Override
public void onReceiveValue(Boolean aBoolean) {
Log.i("---","---");
Log.d("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> init_WebView() :: 사전 쿠키 및 세션 데이터 삭제]");
Log.i("","\n"+"[session :: "+String.valueOf(aBoolean)+"]");
Log.d("//===========//","================================================");
Log.i("---","---");
}
});
cookieManager.removeAllCookies(new ValueCallback() {
@Override
public void onReceiveValue(Object value) {
Log.i("---","---");
Log.d("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> init_WebView() :: 사전 쿠키 및 세션 데이터 삭제]");
Log.i("","\n"+"[cookies :: "+String.valueOf(value)+"]");
Log.d("//===========//","================================================");
Log.i("---","---");
}
});
cookieManager.getInstance().flush();
}
catch (Exception e){
//e.printStackTrace();
}
// */
// -----------------------------------------
// -----------------------------------------
///*
// TODO [웹뷰의 캐시를 초기화 실시 : deleteDatebase 를 이용한 직접 제거]
try {
A_Main.this.deleteDatabase("webview.db");
A_Main.this.deleteDatabase("webviewCache.db");
Log.i("---","---");
Log.d("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> init_WebView() :: 사전 쿠키 및 세션 데이터 삭제]");
Log.i("","\n"+"[로 직 :: 웹뷰 deleteDatabase 수행]");
Log.d("//===========//","================================================");
Log.i("---","---");
}
catch (Exception e){
//e.printStackTrace();
}
// */
// -----------------------------------------
// -----------------------------------------
// TODO [JavaScript 허용]
main_webview.getSettings().setJavaScriptEnabled(true);
// -----------------------------------------
// -----------------------------------------
// TODO [JavaScript의 window.open 허용]
main_webview.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
//main_webview.getSettings().setSupportMultipleWindows(true); // [새창 띄우기 허용 : onCreateWindow 허용]
// -----------------------------------------
// -----------------------------------------
// TODO [자바스크립트 웹 스토리지 사용]
main_webview.getSettings().setDomStorageEnabled(true);
// -----------------------------------------
// -----------------------------------------
// TODO [HTTPS 페이지내 이미지 표시 설정]
if(Build.VERSION.SDK_INT >= 21) {
main_webview.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
}
// -----------------------------------------
// -----------------------------------------
// TODO [스케일 관련 확대, 축소 관련]
main_webview.setInitialScale(8);
main_webview.scrollTo(0,0);
// -----------------------------------------
// -----------------------------------------
// TODO [뷰 포트 및 핀줌 관련]
main_webview.getSettings().setLoadWithOverviewMode(true);
main_webview.getSettings().setUseWideViewPort(true);
main_webview.getSettings().setBuiltInZoomControls(true);
main_webview.getSettings().setSupportZoom(true);
main_webview.getSettings().setDisplayZoomControls(false);
// -----------------------------------------
// -----------------------------------------
// TODO [웹뷰 크롬 브라우저에서 디버깅 모드 설정 허용]
// main_webview.setWebContentsDebuggingEnabled(true);
// -----------------------------------------
// -----------------------------------------
// TODO [Web Client 설정]
main_webview.setWebViewClient(new MainWeb());
// -----------------------------------------
// -----------------------------------------
// TODO [웹뷰가 띄어질 브라우저 선택 : 크롬으로 설정]
main_webview.setWebChromeClient(new WebChromeClient());
// -----------------------------------------
// -----------------------------------------
// TODO [크롬 클라이언트 설정 실시]
main_webview.setWebChromeClient(new WebChromeClient() {
// TODO [웹 브라우저 콘솔 로그 확인]
@Override
public boolean onConsoleMessage(ConsoleMessage consoleMessage) {
Log.i("---","---");
Log.e("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onConsoleMessage() :: 웹 브라우저 콘솔 로그 확인 실시]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[주 소 :: "+String.valueOf(main_webview.getUrl())+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[message [1] :: "+String.valueOf(consoleMessage.message())+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[message [2] :: "+String.valueOf(consoleMessage.toString())+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[sourceId :: "+String.valueOf(consoleMessage.sourceId())+"]");
Log.e("//===========//","================================================");
Log.i("---","---");
return super.onConsoleMessage(consoleMessage);
}
// TODO [실시간 웹뷰 로드 상태 확인]
@Override
public void onProgressChanged(WebView view, int progress) {
Log.i("---","---");
Log.d("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onProgressChanged() :: 실시간 웹뷰 호출 상황 확인 실시]");
Log.i("","\n"+"[주 소 :: "+String.valueOf(main_webview.getUrl())+"]");
Log.i("","\n"+"[호출 상황 :: "+String.valueOf(progress)+"]");
Log.d("//===========//","================================================");
Log.i("---","---");
// [웹뷰 로드 완료 상태 : 웹뷰의 호출 상황이 100 인 경우]
if(progress >= 100){
Log.i("---","---");
Log.w("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onProgressChanged() :: 실시간 웹뷰 호출 상황 확인 실시]");
Log.i("","\n"+"[주 소 :: "+String.valueOf(main_webview.getUrl())+"]");
Log.i("","\n"+"[호출 상황 :: "+String.valueOf(progress)+"]");
Log.i("","\n"+"[상 태 :: "+"웹뷰 로드 완료 상태"+"]");
Log.w("//===========//","================================================");
Log.i("---","---");
// ----------------------------------
try {
// [SEARCH FAST] : [인트로 화면 처리]
introBgImageView.setVisibility(View.GONE);
main_webview.setVisibility(View.VISIBLE);
}
catch (Exception e){
e.printStackTrace();
}
// ----------------------------------
try {
if (cookieManager.hasCookies() == true){
Log.i("---","---");
Log.w("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onProgressChanged() :: 실시간 웹뷰 호출 상황 확인 실시]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[주 소 :: "+String.valueOf(main_webview.getUrl())+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[상 태 :: "+"웹뷰 로드 완료 상태"+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[저장된 쿠키 확인 :: "+"쿠키 있음"+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[쿠 키 :: "+String.valueOf(cookieManager.getCookie(main_webview.getUrl()))+"]");
Log.w("//===========//","================================================");
Log.i("---","---");
}
else {
Log.i("---","---");
Log.e("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onProgressChanged() :: 실시간 웹뷰 호출 상황 확인 실시]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[주 소 :: "+String.valueOf(main_webview.getUrl())+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[상 태 :: "+"웹뷰 로드 완료 상태"+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[저장된 쿠키 확인 :: "+"쿠키 없음"+"]");
Log.e("//===========//","================================================");
Log.i("---","---");
}
}
catch (Exception e){
//e.printStackTrace();
}
// ----------------------------------
}
}
});
// -----------------------------------------
// -----------------------------------------
// TODO [SEARCH FAST] : [자바스크립트 통신]
Javascript_To_Android_Bridge();
// -----------------------------------------
// -----------------------------------------
// TODO [웹뷰 리소스 초기화 관련]
try {
main_webview.getSettings().setAppCacheEnabled(false); // [앱 내부 캐시 사용 여부 설정]
main_webview.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE); // [웹뷰 캐시 모드 설정 [캐시 모드 사용 않고 네트워크 사용해 로드]]
//WebStorage.getInstance().deleteAllData(); // [웹 스토리지 데이터 지우기]
}
catch (Exception e){
//e.printStackTrace();
}
// -----------------------------------------
// -----------------------------------------
// TODO [웹뷰 인코딩 설정]
try {
main_webview.getSettings().setDefaultTextEncodingName("UTF-8");
}
catch (Exception e){
//e.printStackTrace();
}
// -----------------------------------------
// -----------------------------------------
// TODO [웹뷰 로드 수행 실시 부분 : 내부 웹뷰 이동]
main_webview.loadUrl(url);
// -----------------------------------------
// -----------------------------------------
// TODO [테스트 html 파일 로드 : 로컬 assets 파일에 저장된 html 파일]
/*
String htmlJsUrl = "file:///android_asset/javaScriptTest.html";
main_webview.loadUrl(htmlJsUrl);
// */
// -----------------------------------------
}
catch (Exception e){
e.printStackTrace();
}
}
// TODO [WebViewClient 는 웹뷰에서 자유롭게 기능을 사용하기 위함]
class MainWeb extends WebViewClient {
// [로딩이 시작될 때]
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
Log.i("---","---");
Log.d("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onPageStarted() :: [웹 클라이언트]]");
Log.i("","\n"+"[설 명 :: "+String.valueOf("로딩 시작")+"]");
Log.d("//===========//","================================================");
Log.i("---","---");
}
// [리소스를 로드하는 중 여러번 호출]
@Override
public void onLoadResource(WebView view, String url) {
super.onLoadResource(view, url);
Log.i("---","---");
Log.d("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onLoadResource() :: [웹 클라이언트]]");
Log.i("","\n"+"[주 소 :: "+String.valueOf(url)+"]");
Log.i("","\n"+"[설 명 :: "+String.valueOf("로드 중")+"]");
Log.d("//===========//","================================================");
Log.i("---","---");
}
// [방문 내역을 히스토리에 업데이트 할 때]
@Override
public void doUpdateVisitedHistory(WebView view, String url, boolean isReload) {
super.doUpdateVisitedHistory(view, url, isReload);
Log.i("---","---");
Log.d("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> doUpdateVisitedHistory() :: [웹 클라이언트]]");
Log.i("","\n"+"[설 명 :: "+String.valueOf("방문내역 업데이트")+"]");
Log.d("//===========//","================================================");
Log.i("---","---");
}
// [로딩이 완료됐을 때 한번 호출]
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
Log.i("---","---");
Log.w("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onPageFinished() :: [웹 클라이언트]]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[로드 완료 주소 :: "+String.valueOf(url)+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[getUrl 주소 :: "+String.valueOf(main_webview.getUrl())+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[getOriginalUrl 주소 :: "+String.valueOf(main_webview.getOriginalUrl())+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[설 명 :: "+String.valueOf("로드 완료")+"]");
Log.w("//===========//","================================================");
Log.i("---","---");
}
// [오류가 났을 경우 응답 콜백 부분]
@Override
public void onReceivedHttpError(WebView view, WebResourceRequest request, WebResourceResponse errorResponse) {
Log.i("---","---");
Log.e("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onReceivedHttpError() :: [웹 클라이언트]]");
Log.i("","\n"+"[설 명 :: "+String.valueOf("웹뷰 로드 수행 에러 발생")+"]");
Log.i("","\n"+"[errorUrl :: "+String.valueOf(request.getUrl())+"]");
Log.i("","\n"+"[errorCode :: "+String.valueOf(errorResponse.getStatusCode())+"]");
Log.i("","\n"+"[errorResponseHeader :: "+String.valueOf(errorResponse.getResponseHeaders())+"]");
Log.i("","\n"+"[errorResponseData :: "+String.valueOf(errorResponse.getData())+"]");
Log.e("//===========//","================================================");
Log.i("---","---");
}
// [오류가 났을 경우, 오류는 복수할 수 없음]
@Override
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
super.onReceivedError(view, errorCode, description, failingUrl);
switch (errorCode) {
case ERROR_AUTHENTICATION:
Log.i("---","---");
Log.e("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onReceivedError() :: [웹 클라이언트]]");
Log.i("","\n"+"[타 입 :: "+String.valueOf("ERROR_AUTHENTICATION")+"]");
Log.i("","\n"+"[설 명 :: "+String.valueOf("서버에서 사용자 인증 실패")+"]");
Log.e("//===========//","================================================");
Log.i("---","---");
break;
case ERROR_BAD_URL:
Log.i("---","---");
Log.e("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onReceivedError() :: [웹 클라이언트]]");
Log.i("","\n"+"[타 입 :: "+String.valueOf("ERROR_BAD_URL")+"]");
Log.i("","\n"+"[설 명 :: "+String.valueOf("잘못된 URL")+"]");
Log.e("//===========//","================================================");
Log.i("---","---");
break;
case ERROR_CONNECT:
Log.i("---","---");
Log.e("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onReceivedError() :: [웹 클라이언트]]");
Log.i("","\n"+"[타 입 :: "+String.valueOf("ERROR_CONNECT")+"]");
Log.i("","\n"+"[설 명 :: "+String.valueOf("서버로 연결 실패")+"]");
Log.e("//===========//","================================================");
Log.i("---","---");
break;
case ERROR_FAILED_SSL_HANDSHAKE:
Log.i("---","---");
Log.e("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onReceivedError() :: [웹 클라이언트]]");
Log.i("","\n"+"[타 입 :: "+String.valueOf("ERROR_FAILED_SSL_HANDSHAKE")+"]");
Log.i("","\n"+"[설 명 :: "+String.valueOf("SSL handshake 수행 실패")+"]");
Log.e("//===========//","================================================");
Log.i("---","---");
break;
case ERROR_FILE:
Log.i("---","---");
Log.e("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onReceivedError() :: [웹 클라이언트]]");
Log.i("","\n"+"[타 입 :: "+String.valueOf("ERROR_FILE")+"]");
Log.i("","\n"+"[설 명 :: "+String.valueOf("일반 파일 오류")+"]");
Log.e("//===========//","================================================");
Log.i("---","---");
break;
case ERROR_FILE_NOT_FOUND:
Log.i("---","---");
Log.e("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onReceivedError() :: [웹 클라이언트]]");
Log.i("","\n"+"[타 입 :: "+String.valueOf("ERROR_FILE_NOT_FOUND")+"]");
Log.i("","\n"+"[설 명 :: "+String.valueOf("파일을 찾을 수 없습니다")+"]");
Log.e("//===========//","================================================");
Log.i("---","---");
break;
case ERROR_HOST_LOOKUP:
Log.i("---","---");
Log.e("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onReceivedError() :: [웹 클라이언트]]");
Log.i("","\n"+"[타 입 :: "+String.valueOf("ERROR_HOST_LOOKUP")+"]");
Log.i("","\n"+"[설 명 :: "+String.valueOf("서버 또는 프록시 호스트 이름 조회 실패")+"]");
Log.e("//===========//","================================================");
Log.i("---","---");
break;
case ERROR_IO:
Log.i("---","---");
Log.e("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onReceivedError() :: [웹 클라이언트]]");
Log.i("","\n"+"[타 입 :: "+String.valueOf("ERROR_IO")+"]");
Log.i("","\n"+"[설 명 :: "+String.valueOf("서버에서 읽거나 서버로 쓰기 실패")+"]");
Log.e("//===========//","================================================");
Log.i("---","---");
break;
case ERROR_PROXY_AUTHENTICATION:
Log.i("---","---");
Log.e("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onReceivedError() :: [웹 클라이언트]]");
Log.i("","\n"+"[타 입 :: "+String.valueOf("ERROR_PROXY_AUTHENTICATION")+"]");
Log.i("","\n"+"[설 명 :: "+String.valueOf("프록시에서 사용자 인증 실패")+"]");
Log.e("//===========//","================================================");
Log.i("---","---");
break;
case ERROR_REDIRECT_LOOP:
Log.d("---","---");
Log.e("//===========//","================================================");
Log.d("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onReceivedError() :: [웹 클라이언트]]");
Log.d("","\n"+"[타 입 :: "+String.valueOf("ERROR_REDIRECT_LOOP")+"]");
Log.d("","\n"+"[설 명 :: "+String.valueOf("너무 많은 리디렉션")+"]");
Log.e("//===========//","================================================");
Log.d("---","---");
break;
case ERROR_TIMEOUT:
Log.i("---","---");
Log.e("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onReceivedError() :: [웹 클라이언트]]");
Log.i("","\n"+"[타 입 :: "+String.valueOf("ERROR_TIMEOUT")+"]");
Log.i("","\n"+"[설 명 :: "+String.valueOf("연결 시간 초과")+"]");
Log.e("//===========//","================================================");
Log.i("---","---");
break;
case ERROR_TOO_MANY_REQUESTS:
Log.i("---","---");
Log.e("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onReceivedError() :: [웹 클라이언트]]");
Log.i("","\n"+"[타 입 :: "+String.valueOf("ERROR_TOO_MANY_REQUESTS")+"]");
Log.i("","\n"+"[설 명 :: "+String.valueOf("페이지 로드중 너무 많은 요청 발생")+"]");
Log.e("//===========//","================================================");
Log.i("---","---");
break;
case ERROR_UNKNOWN:
Log.i("---","---");
Log.e("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onReceivedError() :: [웹 클라이언트]]");
Log.i("","\n"+"[타 입 :: "+String.valueOf("ERROR_UNKNOWN")+"]");
Log.i("","\n"+"[설 명 :: "+String.valueOf("일반 오류")+"]");
Log.e("//===========//","================================================");
Log.i("---","---");
break;
case ERROR_UNSUPPORTED_AUTH_SCHEME:
Log.d("---","---");
Log.e("//===========//","================================================");
Log.d("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onReceivedError() :: [웹 클라이언트]]");
Log.d("","\n"+"[타 입 :: "+String.valueOf("ERROR_UNSUPPORTED_AUTH_SCHEME")+"]");
Log.d("","\n"+"[설 명 :: "+String.valueOf("지원되지 않는 인증 체계")+"]");
Log.e("//===========//","================================================");
Log.d("---","---");
break;
case ERROR_UNSUPPORTED_SCHEME:
Log.i("---","---");
Log.e("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onReceivedError() :: [웹 클라이언트]]");
Log.i("","\n"+"[타 입 :: "+String.valueOf("ERROR_UNSUPPORTED_SCHEME")+"]");
Log.i("","\n"+"[설 명 :: "+String.valueOf("URI가 지원되지 않는 방식")+"]");
Log.e("//===========//","================================================");
Log.i("---","---");
break;
}
}
@Override
public void onReceivedSslError(WebView view, final SslErrorHandler handler, SslError error) {
// [E/chromium: [ERROR:ssl_client_socket_impl.cc 에러 해결 위함]
try {
Log.i("---","---");
Log.e("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onReceivedSslError() :: [웹 클라이언트]]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[설 명 :: "+String.valueOf("사이트 인증서 문제 발생")+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[getUrl 주소 :: "+String.valueOf(main_webview.getUrl())+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[getOriginalUrl 주소 :: "+String.valueOf(main_webview.getOriginalUrl())+"]");
Log.e("//===========//","================================================");
Log.i("---","---");
// TODO [ssl 접속 에러가 발생한 경우 경고 팝업창 처리 실시]
final AlertDialog.Builder builder = new AlertDialog.Builder(A_Main.this);
builder.setMessage("이 사이트의 보안 인증서는 신뢰하는 보안 인증서가 아닙니다. 계속하시겠습니까?");
builder.setPositiveButton("계속하기", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
handler.proceed();
}
});
builder.setNegativeButton("취소", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
handler.cancel();
}
});
final AlertDialog dialog = builder.create();
dialog.show();
}
catch (Exception e){
e.printStackTrace();
}
// [SSL 에러 타입 확인 실시]
switch (error.getPrimaryError()) {
case SslError.SSL_UNTRUSTED:
Log.i("---","---");
Log.e("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onReceivedSslError() :: [웹 클라이언트]]");
Log.i("","\n"+"[타 입 :: "+String.valueOf("SSL_UNTRUSTED")+"]");
Log.i("","\n"+"[설 명 :: "+String.valueOf("이 사이트의 보안 인증서는 신뢰할 수 없습니다")+"]");
Log.e("//===========//","================================================");
Log.i("---","---");
break;
case SslError.SSL_EXPIRED:
Log.i("---","---");
Log.e("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onReceivedSslError() :: [웹 클라이언트]]");
Log.i("","\n"+"[타 입 :: "+String.valueOf("SSL_EXPIRED")+"]");
Log.i("","\n"+"[설 명 :: "+String.valueOf("보안 인증서가 만료되었습니다")+"]");
Log.e("//===========//","================================================");
Log.i("---","---");
break;
case SslError.SSL_IDMISMATCH:
Log.i("---","---");
Log.e("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onReceivedSslError() :: [웹 클라이언트]]");
Log.i("","\n"+"[타 입 :: "+String.valueOf("SSL_IDMISMATCH")+"]");
Log.i("","\n"+"[설 명 :: "+String.valueOf("보안 인증서가 ID 일치하지 않습니다")+"]");
Log.e("//===========//","================================================");
Log.i("---","---");
break;
case SslError.SSL_NOTYETVALID:
Log.i("---","---");
Log.e("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onReceivedSslError() :: [웹 클라이언트]]");
Log.i("","\n"+"[타 입 :: "+String.valueOf("SSL_NOTYETVALID")+"]");
Log.i("","\n"+"[설 명 :: "+String.valueOf("보안 인증서가 유효하지 않습니다")+"]");
Log.e("//===========//","================================================");
Log.i("---","---");
break;
}
}
// [http 인증 요청이 있는 경우, 기본 동작은 요청 취소]
@Override
public void onReceivedHttpAuthRequest(WebView view, HttpAuthHandler handler, String host, String realm) {
super.onReceivedHttpAuthRequest(view, handler, host, realm);
Log.i("---","---");
Log.d("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onReceivedHttpAuthRequest() :: [웹 클라이언트]]");
Log.i("","\n"+"[설 명 :: "+String.valueOf("http 인증 요청")+"]");
Log.d("//===========//","================================================");
Log.i("---","---");
}
// [확대나 크기 등의 변화가 있는 경우]
@Override
public void onScaleChanged(WebView view, float oldScale, float newScale) {
super.onScaleChanged(view, oldScale, newScale);
Log.i("---","---");
Log.d("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onScaleChanged() :: [웹 클라이언트]]");
Log.i("","\n"+"[설 명 :: "+String.valueOf("화면 크기 변화")+"]");
Log.d("//===========//","================================================");
Log.i("---","---");
}
// [웹 페이지 내에서 페이지 이동 key 이벤트 발생]
@Override
public boolean shouldOverrideKeyEvent(WebView view, KeyEvent event) {
Log.i("---","---");
Log.d("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> shouldOverrideKeyEvent() :: [웹 클라이언트]]");
Log.i("","\n"+"[설 명 :: "+String.valueOf("웹 페이지 내에서 페이지 이동 key 이벤트 발생")+"]");
Log.d("//===========//","================================================");
Log.i("---","---");
return super.shouldOverrideKeyEvent(view, event);
}
// [새로운 URL이 webview에 로드되려 할 경우 컨트롤을 대신할 기회를 줌]
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
Log.i("---","---");
Log.w("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> shouldOverrideUrlLoading() :: [웹 클라이언트]]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[로딩 주소 :: "+String.valueOf(url)+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[getUrl 주소 :: "+String.valueOf(main_webview.getUrl())+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[getOriginalUrl 주소 :: "+String.valueOf(main_webview.getOriginalUrl())+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[설 명 :: "+String.valueOf("새로운 URL이 webview에 로드")+"]");
Log.w("//===========//","================================================");
Log.i("---","---");
// TODO [intent 딥링크 스키마 확인 실시]
if (url.startsWith("intent") && url.toLowerCase().contains("package")){
Intent intent = null;
try {
intent = Intent.parseUri(url, Intent.URI_INTENT_SCHEME); // 딥링크 스키마 확인
String packgeName = String.valueOf(intent.getPackage()); // 스키마에 포함된 패키지명 확인
// [스키마에 포함된 패키지 명이 널이 아닌 경우]
if (C_Util.stringNotNull(packgeName) == true) {
Intent existPackage = getPackageManager().getLaunchIntentForPackage(intent.getPackage());
if (existPackage != null) {
Log.i("---","---");
Log.w("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> shouldOverrideUrlLoading() :: [웹 클라이언트]]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[타 입 :: "+String.valueOf("intent / package")+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[전체 데이터 :: "+String.valueOf(url.toString())+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[패키지 명 :: "+String.valueOf(packgeName)+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[success [성공] :: 스키마 외부 앱 이동 수행 실시]");
Log.w("//===========//","================================================");
Log.i("---","---");
// [스키마 사용해 외부앱 이동 수행 실시]
intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
startActivity(intent);
} else {
Log.i("---","---");
Log.e("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> shouldOverrideUrlLoading() :: [웹 클라이언트]]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[타 입 :: "+String.valueOf("intent / package")+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[패키지 명 :: "+String.valueOf(packgeName)+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[error [에러] :: existPackage is null]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[로 직 :: 마켓 이동 수행 실시]");
Log.e("//===========//","================================================");
Log.i("---","---");
// [마켓 이동 수행 실시]
C_MoveApp.goMarketRun(A_Main.this, packgeName);
}
}
else {
Log.i("---","---");
Log.e("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> shouldOverrideUrlLoading() :: [웹 클라이언트]]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[타 입 :: "+String.valueOf("intent / package")+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[패키지 명 :: "+String.valueOf(packgeName)+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[error [에러] :: PackageName Error]");
Log.e("//===========//","================================================");
Log.i("---","---");
}
}
catch (URISyntaxException e){
// [URI 문법 오류 시 처리 구간]
Log.i("---","---");
Log.e("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> shouldOverrideUrlLoading() :: [웹 클라이언트]]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[타 입 :: "+String.valueOf("intent / package")+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[catch [URISyntaxException] :: Intent URL Scheme 문법 오류 발생]");
Log.e("//===========//","================================================");
Log.i("---","---");
}
catch (ActivityNotFoundException e){
// [인텐트 이동을 수행할 앱을 발견하지 못한 경우]
String packageName = String.valueOf(intent.getPackage());
// [패키지 명이 널이 아닌 경우]
if (C_Util.stringNotNull(packageName) == true){
Log.i("---","---");
Log.e("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> shouldOverrideUrlLoading() :: [웹 클라이언트]]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[타 입 :: "+String.valueOf("intent / package")+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[패키지명 :: "+String.valueOf(packageName)+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[catch [ActivityNotFoundException] :: 외부 앱 설치 진행 실시]");
Log.e("//===========//","================================================");
Log.i("---","---");
// [마켓 이동 수행 실시]
C_MoveApp.goMarketRun(A_Main.this, packageName);
}
else {
Log.i("---","---");
Log.e("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> shouldOverrideUrlLoading() :: [웹 클라이언트]]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[타 입 :: "+String.valueOf("intent / package")+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[catch [ActivityNotFoundException] :: 외부 앱 설치 실패]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[error :: PackgeName Error]");
Log.e("//===========//","================================================");
Log.i("---","---");
}
}
// ----------------------------------
// [return 값을 반드시 true 설정]
return true;
// ----------------------------------
}
// TODO [SMS 인텐트 이동 실시 : if(url.startsWith("sms:010-5678-1234")]
if (url.startsWith("sms:")) {
Log.i("---","---");
Log.w("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> shouldOverrideUrlLoading() :: [웹 클라이언트]]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[타 입 :: "+String.valueOf("sms")+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[정 보 :: "+String.valueOf(url)+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[로 직 :: "+String.valueOf("문자 이동 수행 실시")+"]");
Log.w("//===========//","================================================");
Log.i("---","---");
// ----------------------------------
// [sms 이동 메소드 호출]
C_Intent.goSmsIntent(A_Main.this, url);
// ----------------------------------
// [return 값을 반드시 true 설정]
return true;
// ----------------------------------
}
// TODO [전화 다이얼 인텐트 이동 실시 : if(url.startsWith("tel:010-1234-5678")]
if(url.startsWith("tel:")){
Log.i("---","---");
Log.w("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> shouldOverrideUrlLoading() :: [웹 클라이언트]]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[타 입 :: "+String.valueOf("tel")+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[정 보 :: "+String.valueOf(url)+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[로 직 :: "+String.valueOf("전화 다이얼 이동 수행 실시")+"]");
Log.w("//===========//","================================================");
Log.i("---","---");
// ----------------------------------
// [전화 다이얼 이동 메소드 호출]
C_Intent.goTelIntent(A_Main.this, url);
// ----------------------------------
// [return 값을 반드시 true 설정]
return true;
// ----------------------------------
}
// TODO [Mail (Gmail) 인텐트 이동 실시 : if(url.startsWith("mailto:honggildung@test.com?subject=tittle&body=content")]
if(url.startsWith("mailto:")){
Log.i("---","---");
Log.w("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> shouldOverrideUrlLoading() :: [웹 클라이언트]]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[타 입 :: "+String.valueOf("mailto")+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[정 보 :: "+String.valueOf(url)+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[로 직 :: "+String.valueOf("메일 이동 수행 실시")+"]");
Log.w("//===========//","================================================");
Log.i("---","---");
// ----------------------------------
// [메일 이동 메소드 호출]
C_Intent.goMailIntent(A_Main.this, url);
// ----------------------------------
// [return 값을 반드시 true 설정]
return true;
// ----------------------------------
}
// TODO [하이퍼링크 이동 실시 : if(url.startsWith("l:https://naver.com")]
if(url.startsWith("l:")){
Log.i("---","---");
Log.w("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> shouldOverrideUrlLoading() :: [웹 클라이언트]]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[타 입 :: "+String.valueOf("하이퍼링크")+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[정 보 :: "+String.valueOf(url)+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[로 직 :: "+String.valueOf("외부 링크 이동 수행 실시")+"]");
Log.w("//===========//","================================================");
Log.i("---","---");
// ----------------------------------
// [하이퍼링크 이동 메소드 호출]
C_Intent.goLinkIntent(A_Main.this, url);
// ----------------------------------
// [return 값을 반드시 true 설정]
return true;
// ----------------------------------
}
// ----------------------------------
// [새로운 웹뷰 로드 수행]
view.loadUrl(url);
// ----------------------------------
// ----------------------------------
// [return 값을 반드시 false 설정]
return false;
// ----------------------------------
}
}
// TODO [자바스크립트 >> 안드로이드 - 경로 지정 : 브릿지 경로에 location 추가 시 웹뷰 무한 로딩 현상 발생]
public void Javascript_To_Android_Bridge(){
Log.i("---","---");
Log.w("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> Javascript_To_Android_Bridge() :: 자바스크립트 통신 브릿지 경로 추가 실시]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[경로 [1] :: "+String.valueOf("android")+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[경로 [2] :: "+String.valueOf("main")+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[경로 [3] :: "+String.valueOf("media")+"]");
Log.w("//===========//","================================================");
Log.i("---","---");
// -----------------------------------------
// [SEARCH FAST] : [자바스크립트 통신]
// -----------------------------------------
// [서버 : window.android.함수(); : 임시]
main_webview.addJavascriptInterface(new AndroidBridge(), "android"); // [자바스크립트에 대응할 함수를 정의한 클래스 붙여줌]
// -----------------------------------------
// [서버 : window.main.함수(); : 임시]
main_webview.addJavascriptInterface(new AndroidBridge(), "main"); // [자바스크립트에 대응할 함수를 정의한 클래스 붙여줌]
// -----------------------------------------
// [서버 : window.media.함수(); : 임시]
main_webview.addJavascriptInterface(new AndroidBridge(), "media"); // [자바스크립트에 대응할 함수를 정의한 클래스 붙여줌]
// -----------------------------------------
}
// TODO [자바스크립트 >> 안드로이드 - 함수 지정]
// [SEARCH FAST] : [자바스크립트 통신]
class AndroidBridge {
// -----------------------------------------
// [자바스크립트에서 호출하는 안드로이드 메소드]
@JavascriptInterface
public void system() {
js_handler.post(new Runnable() {
public void run() {
try {
Log.i("---","---");
Log.w("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> AndroidBridge :: system() :: JS >> Android]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[전달받은 데이터 :: "+String.valueOf("")+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[설 명 :: "+String.valueOf("사용자 전체 계정 정보 요청")+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[로 직 :: "+"setSystem() 메소드 호출 수행 실시"+"]");
Log.w("//===========//","================================================");
Log.i("---","---");
// -----------------------------------------
// [로그인 스키마 데이터 json 변환 실시]
JSONObject loginJson = null;
String loginData = S_Preference.getString(getApplication(), S_FinalData.PRE_SCHEME_DATA_LOGIN);
boolean loginFlag = false;
if (C_Util.stringNotNull(loginData) == true){ // [널 값이 아닌 경우]
try {
// [json 객체에 데이터 삽입 실시]
loginJson = new JSONObject(String.valueOf(loginData));
// [플래그 값 변경]
loginFlag = true;
}
catch (Exception e){
// [플래그 값 변경]
loginFlag = false;
}
}
Log.i("---","---");
Log.w("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> AndroidBridge :: system() :: JS >> Android]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[설 명 :: "+String.valueOf("[사전] 로그인 스키마 데이터 값 체크 실시")+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[스키마 데이터 :: "+String.valueOf(loginData)+"]");
Log.w("//===========//","================================================");
Log.i("---","---");
// -----------------------------------------
// [일반 스키마 데이터 json 변환 실시]
JSONObject callJson = null;
String callData = S_Preference.getString(getApplication(), S_FinalData.PRE_SCHEME_DATA_CALL);
boolean callFlag = false;
if (C_Util.stringNotNull(callData) == true){ // [널 값이 아닌 경우]
try {
// [json 객체에 데이터 삽입 실시]
callJson = new JSONObject(String.valueOf(callData));
// [플래그 값 변경]
callFlag = true;
}
catch (Exception e){
// [플래그 값 변경]
callFlag = false;
}
}
Log.i("---","---");
Log.w("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> AndroidBridge :: system() :: JS >> Android]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[설 명 :: "+String.valueOf("[사전] 일반 스키마 데이터 값 체크 실시")+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[스키마 데이터 :: "+String.valueOf(callData)+"]");
Log.w("//===========//","================================================");
Log.i("---","---");
// -----------------------------------------
// [전체 자바스크립트로 전송할 데이터 생성 실시]
JSONObject setSystemJson = new JSONObject();
// [디바이스 고유 값]
setSystemJson.put("moco", S_DeviceID.getDeviceID(A_Main.this));
// [앱 버전 (ex : 1.0.0)]
setSystemJson.put("version", S_Preference.getString(getApplication(), S_FinalData.PRE_MOBILE_VERSION));
// [앱 버전 코드 (ex : 1)]
setSystemJson.put("code", S_Preference.getString(getApplication(), S_FinalData.PRE_MOBILE_CODE));
// [모바일 플랫폼]
setSystemJson.put("plat", S_FinalData.PRE_MOBILE_PLAT);
// [파이어베이스 푸시 토큰]
setSystemJson.put("token", S_Preference.getString(getApplication(), S_FinalData.PRE_PUSH_TOKEN));
// [로그인 스키마 데이터]
if (loginFlag == true){
setSystemJson.put("loginScheme", loginJson);
}
else {
setSystemJson.put("loginScheme", "");
}
// [일반 스키마 데이터]
if (callFlag == true){
setSystemJson.put("callScheme", callJson);
}
else {
setSystemJson.put("callScheme", "");
}
// -----------------------------------------
// [Android >> JS 호출 수행 실시]
new Android_To_Javascript().setSystem(String.valueOf(setSystemJson.toString()));
// -----------------------------------------
}
catch (Exception e){
e.printStackTrace();
}
}
});
}
// -----------------------------------------
// [자바스크립트에서 호출하는 안드로이드 메소드]
@JavascriptInterface
public void setMarket(final String arg) {
js_handler.post(new Runnable() {
public void run() {
try {
String value = String.valueOf(arg);
Log.i("---","---");
Log.w("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> AndroidBridge :: setMarket() :: JS >> Android]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[전달받은 데이터 :: "+String.valueOf(value)+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[설 명 :: "+String.valueOf("마켓 이동 정보 전달 받음")+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[로 직 :: "+"마켓 이동 수행 실시"+"]");
Log.w("//===========//","================================================");
Log.i("---","---");
// -----------------------------------------
// [자바스크립트 데이터 방어 로직 추가 실시 : 데이터 널 체크]
if (C_Util.stringNotNull(value.trim()) == true){
}
else {
Log.i("---","---");
Log.e("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> AndroidBridge :: setMarket() :: JS >> Android]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[전달받은 데이터 :: "+String.valueOf(value)+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[error [에러] :: "+String.valueOf(S_FinalData.ERROR_DATA_NULL)+"]");
Log.e("//===========//","================================================");
Log.i("---","---");
// [에러 팝업창 알림 표시]
C_Ui_View.showAlert(
A_Main.this,
0,
S_FinalData.AL_TITLE,
S_FinalData.ERROR_DATA_NULL + " [setMarket]",
S_FinalData.AL_OK, "", "");
// [리턴 종료 실시]
return;
}
// -----------------------------------------
// [자바스크립트 데이터 방어 로직 추가 실시 : key 값 체크]
if (C_Util.stringMultiContains(value.toLowerCase().trim(), new String [] {"android", "package"}) == true){
}
else {
Log.i("---","---");
Log.e("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> AndroidBridge :: setMarket() :: JS >> Android]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[전달받은 데이터 :: "+String.valueOf(value)+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[error [에러] :: "+String.valueOf(S_FinalData.ERROR_PARSING_KEY)+"]");
Log.e("//===========//","================================================");
Log.i("---","---");
// [에러 팝업창 알림 표시]
C_Ui_View.showAlert(
A_Main.this,
0,
S_FinalData.AL_TITLE,
S_FinalData.ERROR_PARSING_KEY + " [setMarket]",
S_FinalData.AL_OK, "", "");
// [리턴 종료 실시]
return;
}
// -----------------------------------------
// [자바스크립트 데이터 방어 로직 추가 실시 : json 데이터 형식 체크 실시]
if (C_Util.stringJsonObjectEnable(value) == true){ // [Json 파싱 가능한 경우]
// [json 객체 생성]
JSONObject responseJson = new JSONObject(value);
// [특정 key 포함 여부 확인]
if (responseJson.has("android")){
JSONObject packgesJson = new JSONObject(String.valueOf(responseJson.get("android")));
String packageName = String.valueOf(packgesJson.get("package"));
// [자바스크립트 데이터 방어 로직 추가 실시 : 파싱 data 값 체크]
if (C_Util.stringNotNull(packageName) == true){
}
else {
Log.i("---","---");
Log.e("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> AndroidBridge :: setMarket() :: JS >> Android]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[전달받은 데이터 :: "+String.valueOf(value)+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[error [에러] :: "+String.valueOf(S_FinalData.ERROR_PARSING_DATA)+"]");
Log.e("//===========//","================================================");
Log.i("---","---");
// [에러 팝업창 알림 표시]
C_Ui_View.showAlert(
A_Main.this,
0,
S_FinalData.AL_TITLE,
S_FinalData.ERROR_PARSING_DATA + " [setMarket]",
S_FinalData.AL_OK, "", "");
// [리턴 종료 실시]
return;
}
// TODO [앱 스토어 이동 실시]
C_MoveApp.goMarketRun(A_Main.this, packageName);
}
}
else { // [Json 파싱 불가능한 경우]
Log.i("---","---");
Log.e("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> AndroidBridge :: setMarket() :: JS >> Android]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[전달받은 데이터 :: "+String.valueOf(value)+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[error [에러] :: "+String.valueOf(S_FinalData.ERROR_JSON_PARSING)+"]");
Log.e("//===========//","================================================");
Log.i("---","---");
// [에러 팝업창 알림 표시]
C_Ui_View.showAlert(
A_Main.this,
0,
S_FinalData.AL_TITLE,
S_FinalData.ERROR_JSON_PARSING + " [setMarket]",
S_FinalData.AL_OK, "", "");
// [리턴 종료 실시]
return;
}
// -----------------------------------------
}
catch (Exception e){
e.printStackTrace();
}
}
});
}
// -----------------------------------------
}
// TODO [안드로이드 >> 자바스크립트]
// [SEARCH FAST] : [자바스크립트 통신]
class Android_To_Javascript{
// -----------------------------------------
// [안드로이드에서 자바스크립트 호출]
public void setSystem(String value){
try {
Log.i("---","---");
Log.w("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> setSystem() :: Android >> JS]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[JS 함수 :: "+String.valueOf("setSystem")+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[전달할 데이터 :: "+String.valueOf(value)+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[설 명 :: "+String.valueOf("사용자 전체 계정 정보 전송")+"]");
Log.w("//===========//","================================================");
Log.i("---","---");
// -----------------------------------------
// TODO [json 형식 데이터 전송 실시 : 주의 세부 json 은 object 로 담아야함]
main_webview.loadUrl("javascript:setSystem('"+String.valueOf(value)+"')");
// -----------------------------------------
}
catch (Exception e){
//e.printStackTrace();
}
}
// -----------------------------------------
// [안드로이드에서 자바스크립트 호출]
public void shakeResult(){
try {
Log.i("---","---");
Log.w("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> shakeResult() :: Android >> JS]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[JS 함수 :: "+String.valueOf("shakeResult")+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[설 명 :: "+String.valueOf("디바이스 흔들기 이벤트 발생 전달")+"]");
Log.w("//===========//","================================================");
Log.i("---","---");
// -----------------------------------------
// TODO [함수 호출]
main_webview.loadUrl("javascript:shakeResult('"+String.valueOf("")+"')");
// -----------------------------------------
}
catch (Exception e){
//e.printStackTrace();
}
}
// -----------------------------------------
}
// TODO [모바일 키 이벤트 발생 체크 부분]
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
// [모바일 디바이스의 뒤로가기 키 이벤트가 발생한 경우]
if (keyCode == KeyEvent.KEYCODE_BACK) {
try {
Log.i("---","---");
Log.w("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onKeyDown() :: 백버튼 터치시 뒤로 가기 이벤트 실시]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[MAIN_URL :: "+String.valueOf(S_FinalData.WV_LOAD_MAIN_ENZ_URL)+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[getUrl() :: "+String.valueOf(main_webview.getUrl())+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[getOriginalUrl() :: "+String.valueOf(main_webview.getOriginalUrl())+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[canGoBack() :: "+String.valueOf(main_webview.canGoBack())+"]");
Log.w("//===========//","================================================");
Log.i("---","---");
// [더이상 웹뷰에서 뒤로갈 페이지가 없을 경우 이거나 메인 로드 주소인 경우]
if (main_webview.canGoBack() == false
|| String.valueOf(main_webview.getUrl()).equals(S_FinalData.WV_LOAD_MAIN_ENZ_URL)
|| String.valueOf(main_webview.getOriginalUrl()).equals(S_FinalData.WV_LOAD_MAIN_ENZ_URL)
|| String.valueOf(main_webview.getUrl()).contains(S_FinalData.WV_BACK_URL_LOGIN)
|| String.valueOf(main_webview.getUrl()).contains(S_FinalData.WV_BACK_URL_SCHOOL)
|| String.valueOf(main_webview.getUrl()).contains(S_FinalData.WV_BACK_URL_MAIN)){
Log.i("---","---");
Log.e("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onKeyDown() :: 백버튼 터치시 뒤로 가기 이벤트 실시]");
Log.i("","\n"+"[로 직 :: "+"애플리케이션 종료 수행 실시"+"]");
Log.e("//===========//","================================================");
Log.i("---","---");
//TODO [2초 내에 다시 버튼을 중복 클릭한 경우]
if (SystemClock.elapsedRealtime() - backTime < 2000){
// [앱 종료 수행 실시]
finishApp();
return true;
}
backTime = SystemClock.elapsedRealtime();
//TODO [처음 버튼 클릭 이벤트가 발생한 경우]
Toast.makeText(getApplication(),"한번 더 뒤로가기를 클릭하시면 앱을 종료합니다",Toast.LENGTH_SHORT).show();
}
// [뒤로 갈 페이지가 있는 경우]
else {
Log.i("---","---");
Log.w("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onKeyDown() :: 백버튼 터치시 뒤로 가기 이벤트 실시]");
Log.i("","\n"+"[로 직 :: "+"웹뷰 뒤로가기 수행 실시"+"]");
Log.w("//===========//","================================================");
Log.i("---","---");
// [웹뷰 뒤로가기]
main_webview.goBack();
}
}
catch (Exception e){
//e.printStackTrace();
}
}
return true;
}
// TODO [바깥 레이아웃 클릭 시 키보드 내림]
@Override
public boolean dispatchTouchEvent(MotionEvent event){
int action = event.getAction();
switch(action){
case(MotionEvent.ACTION_DOWN):
try {
//TODO [창 내리는 용도]
}
catch (Exception e){
//e.printStackTrace();
}
break;
case(MotionEvent.ACTION_MOVE):
break;
default:
break;
}
return super.dispatchTouchEvent(event);
}
// TODO [액티비티 생명 주기 상태 체크 메소드]
@Override
public void onResume(){
super.onResume();
Log.i("---","---");
Log.d("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onResume() :: 액티비티 실행 준비]");
Log.d("//===========//","================================================");
Log.i("---","---");
// -----------------------------------------
// [액티비티 정지 상태 일 경우 로직 처리 실시]
// -----------------------------------------
// -----------------------------------------
// [외부 브라우저 복귀 시 화면 전환 애니메이션 없애기 위함]
try {
overridePendingTransition(0,0);
}
catch (Exception e){
//e.printStackTrace();
}
// -----------------------------------------
// -----------------------------------------
// [SEARCH FAST] : [앱 라이프 사이클 시간 저장]
String foreTime = "";
try {
foreTime = String.valueOf(C_Util.getNowDateTime24Number());
S_Preference.setString(getApplication(), S_FinalData.PRE_WV_RESUME_TIME, foreTime);
S_Preference.setString(getApplication(), S_FinalData.PRE_WV_RESUME_TIME, foreTime);
Log.i("---","---");
Log.w("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onResume() :: 앱 포그라운드 라이프 사이클 시간 저장]");
Log.i("","\n"+"[foreTime :: "+String.valueOf(foreTime)+"]");
Log.w("//===========//","================================================");
Log.i("---","---");
}
catch (Exception e){
e.printStackTrace();
}
// -----------------------------------------
// -----------------------------------------
try {
// [앱 포그라운드 및 백그라운드 상태 체크 앱 리로드 수행]
String appCycleSave = String.valueOf(S_Preference.getString(getApplication(), S_FinalData.PRE_APP_UPDT_TIME));
String pauseTime = String.valueOf(S_Preference.getString(getApplication(), S_FinalData.PRE_WV_PAUSE_TIME));
int appCycleTime = C_Util.getDateMinus(foreTime, pauseTime);
Log.i("---","---");
Log.w("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onResume() :: 앱 포그라운드 라이프 사이클 시간 차이 확인]");
Log.i("","\n"+"[저장된 앱 라이프 사이클 갱신 시간 [분 단위] :: "+String.valueOf(appCycleSave)+"]");
Log.i("","\n"+"[앱 포그라운드 및 백그라운드 시간 차이 :: "+String.valueOf(appCycleTime)+"]");
Log.w("//===========//","================================================");
Log.i("---","---");
if (C_Util.stringNotNull(appCycleSave) == true && appCycleTime >= Integer.parseInt(appCycleSave)){
///*
// -----------------------------------------
// [프리퍼런스 데이터 초기화]
S_Preference.webViewReloadClear(getApplication());
// -----------------------------------------
// [화면 전환 수행]
Intent goPage = new Intent(A_Main.this, A_Intro.class);
goPage.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
startActivity(goPage);
// -----------------------------------------
// [기존 화면 종료]
finish();
overridePendingTransition(0, 0);
// -----------------------------------------
// */
}
}
catch (Exception e){
e.printStackTrace();
}
// -----------------------------------------
}
// TODO [액티비티 생명 주기 상태 체크 메소드]
@Override
public void onPause(){
super.onPause();
Log.i("---","---");
Log.e("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onPause() :: 액티비티 정지 상태]");
Log.e("//===========//","================================================");
Log.i("---","---");
// -----------------------------------------
// [액티비티 정지 상태 일 경우 로직 처리 실시]
// -----------------------------------------
// -----------------------------------------
// [SEARCH FAST] : [앱 라이프 사이클 시간 저장]
try {
String pauseTime = String.valueOf(C_Util.getNowDateTime24Number());
S_Preference.setString(getApplication(), S_FinalData.PRE_WV_PAUSE_TIME, pauseTime);
S_Preference.setString(getApplication(), S_FinalData.PRE_WV_PAUSE_TIME, pauseTime);
Log.i("---","---");
Log.e("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onPause() :: 앱 백그라운드 라이프 사이클 시간 저장]");
Log.i("","\n"+"[pauseTime :: "+String.valueOf(pauseTime)+"]");
Log.e("//===========//","================================================");
Log.i("---","---");
}
catch (Exception e){
e.printStackTrace();
}
// -----------------------------------------
}
// TODO [액티비티 생명 주기 상태 체크 메소드]
@Override
public void onStop(){
super.onStop();
Log.i("---","---");
Log.e("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onStop() :: 액티비티 정지 상태]");
Log.e("//===========//","================================================");
Log.i("---","---");
// -----------------------------------------
// [액티비티 정지 상태 일 경우 로직 처리 실시]
// -----------------------------------------
}
// TODO [액티비티 생명 주기 상태 체크 메소드]
@Override
public void onDestroy(){
//super.onDestroy();
Log.i("---","---");
Log.e("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onDestroy() :: 액티비티 종료 상태]");
Log.e("//===========//","================================================");
Log.i("---","---");
// -----------------------------------------
// [액티비티 종료 상태 일 경우 로직 처리 실시]
// -----------------------------------------
// -----------------------------------------
// [SEARCH FAST] : [프리퍼런스 데이터 초기화]
S_Preference.mainFinishClear(A_Main.this);
// -----------------------------------------
// -----------------------------------------
super.onDestroy();
// -----------------------------------------
}
// TODO [액티비티 종료 코드]
public void finishApp(){
Log.i("---","---");
Log.e("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> finishApp() :: 액티비티 종료 수행 실시]");
Log.i("","\n"+"[로 직 :: "+"finish() 호출"+"]");
Log.e("//===========//","================================================");
Log.i("---","---");
try {
// [앱 종료 수행 실시]
finish(); // [현재 액티비티 정리]
finishAffinity(); // [모든 액티비티 정리]
overridePendingTransition(0, 0);
}
catch (Exception e){
//e.printStackTrace();
}
}
} // TODO [클래스 종료]
[a_main_layout.xml : 소스 코드]
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<!--
[레이아웃 설명]
1. 사용하는 클래스 : A_Main
2. 메인 화면으로 웹뷰를 호출하는 레이아웃
-->
<!-- 컴포넌트 : 이미지 뷰 (웹뷰 로딩) -->
<ImageView
android:id="@+id/introBgImageView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:src="@drawable/newintrobg"
android:scaleType="fitXY"
android:visibility="visible"
android:layout_gravity="center"
android:gravity="center"/>
<!-- 컴포넌트 : 웹뷰 -->
<WebView
android:id="@+id/main_webview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#343d46"
android:visibility="gone"/>
</LinearLayout>
반응형
'투케이2K 유틸파일' 카테고리의 다른 글
Comments