반응형

이번 포스팅은 첨부파일을 통한 Java Class 파일 DeCompile 하는 방법에 대하여 알아보도록 하겠습니다.

 

jad.exe
다운로드

 

 

1. 첨부파일을 Download(jad.exe) 받아 실행

 

 

2. 첨부파일을 Download DeCompile할 Java class 파일과 같이 있는 폴더로 이동시킵니다.

 

 

3. CMD 창을 띄운 후 현재 경로를 Java Class 파일이 있는 폴더로 이동시킵니다.

    

   - cd 명령어 사용

 

 

4. jad -o -sjava 파일명.class 입력해주면 java 파일이 DeCompile이 완료가 됩니다.

반응형

'Development > Java' 카테고리의 다른 글

[Java] StringBuffer vs StringBuilder  (0) 2019.09.26
[Java] Handler 정리  (0) 2019.09.05
[Java] System.arraycopy 사용법  (0) 2019.09.04
반응형

이번 포스팅은 ORACLE DB에서 Lock이 걸렸을 경우 해결방법에 대하여 알아보도록 하겠습니다.




SQL*Plus: Release 11.2.0.1.0 Production on 일 1월 19 13:15:55 2014


Copyright (c) 1982, 2010, Oracle.  All rights reserved.


사용자명 입력: eun

비밀번호 입력:

ERROR:

ORA-28000: the account is locked



사용자명 입력: sys

비밀번호 입력:


다음에 접속됨:

Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production

With the Partitioning, OLAP, Data Mining and Real Application Testing options


SQL> --  SYS 로 접속해서 eun 의 계정 상태를 확인하니 잠겨있다.


 


  1  SELECT USERNAME, ACCOUNT_STATUS


  2        , TO_CHAR(LOCK_DATE, 'YYYMMDDHH24MI') LOCK_DATE

  3 FROM DBA_USERS WHERE USERNAME='AROINTECH';

 


USERNAME                       ACCOUNT_STATUS                   LOCK_DATE

------------------------------ -------------------------------- ------------

EUN                                EXPIRED & LOCKED                 201401191310



SQL> ALTER USER eun ACCOUNT UNLOCK;


사용자가 변경되었습니다. 



반응형
반응형

이번 포스팅은 Intent FLAG에 대하여 알아보도록 하겠습니다.

 

Android  플랫폼에서 Activity 는 또 다른 Activity 를 시작할 수 있고, 각각의 Activity 는 차곡 차곡 Task 라고 불리우는 Activity Stack 에 쌓이게 됩니다. 사용자는 뒤로가기를 통해 현재 화면상에 보이는 Activity 를 종료시키고, 바로 직전에 사용된 Activity로 돌아갈 수 있습니다. 

 

구글에서는 Activity를 호출할 때 사용되는 Intent 에 적절한 플래그 값을 설정해서 Activity Stack 을 제어할 수 있는 방법을 제공해 줍니다. 이 플래그들은  FLAG_ACTIVITY 라는 접두어를 갖고 있는데, 개인적으로 가장 요긴하게 사용하고 있는 FLAG_ACTIVITY 네 가지를 소개해 봅니다. 

 

 

# FLAG_ACTIVITY_SINGLE_TOP


우선 간단하게 그림으로 표현해 보았습니다. 

A 와 B  두 가지 Activity가 있습니다. A라는 Activity는 B Activity를  호출하고, B라는 Activity는 다시 자기 자신인 B Activity를 호출하는 경우라고 가정해 보겠습니다. (A->B->B)

 

 


   
     
  B B(재사용)
A A A

           A                  A->B             A->B->B

 

- 호출하는 B Activity가 이미 Task 의 가장 앞에 위치하는 경우, 또 하나의 B Activity를 생성하지 않습니다.

- 기존에 존재하는 B Activity가 재활용이됩니다. 

- B Activity가 재활용된다는 것을 개발자가 알아채고 새롭게 전달되는 Intent를 사용할 수 있도록 합니다.

   (B Activity 의 onPause() / onNewIntent() / onResume() override 메소드가 순차적으로 호출이 됩니다.)

- 동일한 Activity 를 여러 번 생성하는 것은 메모리 사용량과 Activity 시작 속도 모두에 좋지 않습니다. 이런 경우 FLAG_ACTIVITY_SINGLE_TOP를 적절하게 활용하면 제법 큰 효과를 볼 수 있습니다.

 

 

 # FLAG_ACTIVITY_NO_HISTORY 


우선 간단하게 그림으로 표현해 보았습니다. 

A 와 B  두 가지 Activity 가 있습니다. A라는 Activity는 B를 B라는 Activity는 A를 호출한 후에 (A->B->A) 사용자가 뒤로 가기를 하는 경우를 가정해 보겠습니다.

 

                      <일반적인 경우>                                                       < FLAG_ACTIVITY_NO_HISTORY 적용>

 

             
    A        
  B B     B(흔적X) A
A A A   A A A

           A                   A->B             A->B->A                                      A                  A->B             A->B->A

 

 

- FLAG_ACTIVITY_NO_HISTORY 로 설정된 Intent로 시작된 Activity B는 Task에 그 흔적을 남기지 않게 됩니다. 

- B Activity에서 또 다른 A Activity를 호출한 후, 뒤로 가기를 누르면 일반적인 경우 이전에 실행되었던 B Activity가 나타나지만, FLAG_ACTIVITY_NO_HISTORY를 사용하는 경우 맨 처음에 실행되었던 A Activity가 화면에 표시됩니다. 

- FLAG_ACTIVITY_NO_HISTORY 를 사용하게 되면 Task에 해당 Intent의 정보가 기록되지 않기 때문에, A->B 인 상황에서 Home 버튼 등을 눌러 다른 Task로 전환된 후, 다시 본 Task로 돌아오게 되면, A Activity가 화면에 표시되는 점은 주의해야 합니다.

- 또한, B Activity 의 onDestroy()가 호출되는 시점이 조금 애매합니다. 일반적인 예상과는 달리, B Activity에서 또 다른 A Activity 를 호출하는 세 번째 단계에서는 onStop() 까지만 호출되고, 이 후에 새롭게 호출된 A Activity 가 뒤로 가기 등 Stack에서 사라지는 순간에서야 onDestroy() 가 호출됩니다.

- FLAG_ACTIVITY_NO_HISTORY 는 여러모로 쓸모가 있는데, 특히 특정한 이벤트 알람 등을 위해 Dialog 형태로 화면에 표시되는 Activity에 적용하기에 편리합니다. (대개의 경우 팝업은 해당 시점에 한 번만 보여주면 되니까.)

 

 

#FLAG_ACTIVITY_REORDER_TO_FRONT와 FLAG_ACTIVITY_CLEAR_TOP 


우선 간략하게 그림으로 살펴 보겠습니다. 

A Activity 에서 B Activity를 그리고 B에서 A를 호출하는 상황을 가정해보았습니다. (A->B->A)

 

                      < 일반적인 경우>                                       <FLAG_ACTIVITY_REORDER_TO_FRONT와 FLAG_ACTIVITY_CLEAR_TOP>

 

               
    A          
  B B     B A  
A A A   A A B A

           A                  A->B              A->B->A                                      A                   A->B           (순서 변환)       (A를 최상단)

 

 

- FLAG_ACTIVITY_REORDER_TO_FRONT 는 매우 특이하게도 Task의 순서 자체를 뒤바꿔 줍니다. 

- 호출하는 Activity가 이미 Task 상에 존재하는 경우 해당 Activity를 새롭게 생성하는 대신, 아래쪽에 위치한 Activity의 순서를 Task의 가장 위로 끌어올려줍니다. 

- A->B->A 의 순서로 Activity 호출이 일어날 때, 새로운 A Activity가 생성되는 대신 아래쪽에 위치한 A Activity가 위로 올라와 최종적으로 B->A의 형태로 Task 가 구성되게 됩니다. 

- 어떤 Activity에서 특정 Activity로 점프하는 형식의 Flow를 구성해야하는 경우 요긴하게 사용될 수도 있지만, Task의 순서를 뒤섞는다는 점에서 사용에 주의를 기울일 필요가 있습니다.  (아무 생각없이 남발하게 되면 뒤로 가기 시 엉뚱한 Activity 가 표시되어 사용자들이 굉장히 혼란스러워하는 경우가 있습니다.) 

 

- FLAG_ACTIVITY_CLEAR_TOP  플래그가 사용되는 경우  호출하는 Activity가 이미 Task 상에 존재하는 경우, 해당 Activity 위에 존재하는 다른 Activity 를 모두 종료시켜 줍니다. 

- A->B->A 로 호출이 일어나는 경우, B Activity 가 종료되고, A Activity 만 Task에 남게 됩니다. 

  (A->B->C->A 인 경우에도 마찬가지로 B와 C 가 종료되고 A 만 남게 됩니다.)

 

 

 

[출처] 안드로이드 알아두면 요긴한 FLAG_ACTIVITY 네 가지

반응형

'Development > Android' 카테고리의 다른 글

[Android] Context  (0) 2020.04.08
[Android] Activity 호출  (0) 2020.04.08
[Android] ArrayList 객체를 Intent로 전달하는 방법  (3) 2020.04.08
[Android] MoveEvent Value  (0) 2020.04.08
[Android] Picsasso vs Glide  (0) 2019.10.01
반응형

이번 포스팅은 ArrayList 객체를 Intent로 전달하는 방법에 대하여 알아보도록 하겠습니다.

 

1. 데이터 클래스의 직렬화

 

우선 인자로 전달하기 위해서는 ArrayList에 담기는 데이터 클래스가 직렬화(Serializable interface를 구현)가 되어 있어야 합니다.

 

public class Subway implements Serializable {

......

 

}

  

2. Intent에 데이터 담기

 

ArrayList <Subway> subwayList = new ArrayList <Subway>();

subwayList.add(new Subway(201, "시청"));

 

Intent intent = new Intent();

intent.putExtra("subway",  subwayList);

startActivity(intent);

 

3. 데이터 꺼내서 사용하기

 

ArrayList <Subway> subwayList = (ArrayList <Subway>) getIntent(). getSerializableExtra("subway");

반응형

'Development > Android' 카테고리의 다른 글

[Android] Activity 호출  (0) 2020.04.08
[Android ] Intent FLAG  (0) 2020.04.08
[Android] MoveEvent Value  (0) 2020.04.08
[Android] Picsasso vs Glide  (0) 2019.10.01
[Android] App Architecture 가이드 2  (0) 2019.09.23
반응형

이번 포스팅은 MoveEvent Value를 알아보도록 하겠습니다.

 

Android에서 onTouchListner를 상속받아 구현하게 되면 override 된 메서드를 구현해야 합니다.

 

오늘은 override 메소드에서 자주 쓰이는  MoveEvent Value를 나열해 보겠습니다.

 

1.  ACTION_DOWN = 0

 

2.  ACTION_UP = 1

 

3.  ACTION_MOVE = 2

 

4.  ACTION_CANCEL = 3

 

5.  ACTION_MASK = 255

 

6.  ACTION_POINTER_2_DOWN = 261

반응형
반응형

안녕하세요.

이번 포스팅은 Android OS 10을 TargetSDKVersion 으로 업그레이드 시 파일 조회하는 기능의 경우 발생할 수 있는 오류에 대하여 알아보도록 하겠습니다.


<Error>

TargetSDKVersion을 28에서 29로 업그레이드만 하였을 뿐인데 파일 조회하는 기능에서 아래와 같은 NullPointException이 발생하였습니다.

W/System.err: java.lang.NullPointerException: Attempt to get length of null array

W/System.err:     at com.eun.sample.core.Cert.a(Unknown Source:15)

W/System.err:     at com.eun.sample.core.Cert.<init>(Unknown Source:61)


<Solution>

Android OS 10이 출시되면서 보안이 많이 강화되었으며 이로 인해 파일 Access 제한이 되었습니다.

이를 해결하기 위해서는 Android Developer 외부저장소 Access 페이지를 참조하였으며, 해결방법을 찾을 수 있었습니다.


1. 가장 간단한 방법입니다.

   AndroidMenifest.xml 파일에 requestLagacyExternalStorage 속성을 true로 주어 기존 외부 저장소를 사용할 수 있도록 설정을 합니다.

이로 인해 앞서 발생하였던 Error 부분은 해결이 되었습니다.

    <manifest ... >
     
<!-- This attribute is "false" by default on apps targeting Android 10 or higher. -->
     
<application android:requestLegacyExternalStorage="true" ... >

        ...
     
</application>
   
</manifest>

또한 아래와 같은 설명을 되어 있으니 참고 하시면 좋을 것 같습니다.

 ★ 참고: 기존 외부 저장소를 사용 설정한 상태에서 앱을 설치하면 앱은 제거될 때까지 이 모드로 유지됩니다. 이 호환성 동작은 나중에 기기가 Android 10 이상을 실행하도록 업그레이드되든, 나중에 앱이 Android 10 이상을 타겟팅하도록 업데이트되든 관계없이 적용됩니다.


2. 좀 더 보완적으로 접근할 수 있는 방법입니다.

   저장소 Access Framework를 사용하여 파일을 조회하는 방법입니다.

   우선 아래에 있는 정보 미디어 컬렉션 중 하나를 선택해 조회할 수 있습니다.

   - 사진 : MediaStore.Image 

   - 동영상 : MediaStore.Video

   - 오디오 : MediaStore.Audio

  Download 디렉토리에 있는 파일을 비롯하여 다른 앱에서 만든 다른 파일에 Acccess 하려면 앱에서 사용자가 특정 파일을 선택하도록 허용하는 

저장소 Access Framework를 사용해야 합니다.


이번 포스팅에서 Android OS 10에서 파일 조회 시 NullPointException이 발생하였을 때 해결할 수 있는 방법에 대하여 알아보았습니다.

반응형

+ Recent posts