펌 OK (출처 표시), 상업적 이용 NO, 컨텐츠 변경 NO





Handlermsgint값을 보낼 수 있다는것은 알것이다.

(http://biig.tistory.com/34  -  핸들러 사용법 포스팅)



그렇다면, 메시지로 객체를 전달할 수는 없을까 ??


할 수 있다.


기존에는


handler.sendEmptyMessage(int);


형식으로 메시지를 전송했다면,



같은 위치에서


Message msg = handler.obtainMessage();


으로 선언 해 주면


msg.what(int);

msg.obj(Object);

msg.arg1(int);

msg.arg2(int);


이런식으로 메시지에 객체를 담을 수 도 있고, 인트값도 저렇게 넣어 줄 수 있다.


잘 활용한다면 매우 유용하다.


예를들어 다른 액티비티에 객체를 전달해야 하는 경우, parcelable를 상속받고 기타 과정이 복잡한데


Handler를 통해 Object를 넘겨주면 매우 간단하게 해결이 가능하다.


그리고 sendEmptyMessage 대신


handler.sendMessage(msg);


로 해주면 전달이 완료된다.




펌 OK (출처 표시), 상업적 이용 NO, 컨텐츠 변경 NO




Ctrl + Shift + O

ㄴ 자동 import. import가 필요한 부분은 자동으로 연결 해 주고, 불필요한 import는 제거한다.

    초보의 경우, 빨간줄이 생기면 한번씩 눌러보면 해결되는 경우가 많다.


Ctrl + M

ㄴ 현재 활성화 돼 있는 창 이외의 모든 창을 최소화. 즉 소스코드창이 활성화 돼 있는 상태라면,

    소스코드 창을 제외한 Project창이나 Console창이 최소화돼 소스코드창을 넓게 사용 가능.

    한번 더 누르면 원래상태로 복귀한다.


Ctrl + D

ㄴ 커서 라인을 삭제한다.


Ctrl + Shift + C  == Ctrl + /

ㄴ 선택 영역 또는 현재 라인을 주석처리한다. (한손으로 가능해서 편함)


Ctrl + Alt + 방향키 Up , Down

ㄴ 포커스가 위치한 라인을 위 또는 아래에 그대로 Copy 한다.


Ctrl + F

Find/Replace창 표시


Ctrl + Z , Ctrl + Y

Z는 작업 이전으로, YZ로 뒤로갔던것을 다시 앞으로 돌린다.


Ctrl + W

ㄴ 현재 활성화 된 탭 닫기


Ctrl + S

ㄴ 수정사항 저장


Ctrl + L

ㄴ 라인을 입력하는 창이 나오고, 라인을 입력하면 해당 라인으로 이동


F3

ㄴ 메소드/변수를 블록선택 하고 F3을 누르면 해당 메소드가 선언된곳으로 이동한다.


Ctrl + K, Ctrl + Shift + K

ㄴ 메소드/변수를 블록선택하고 단축키를 실행하면 선택된 메소드의 사용한 이전, 다음 사용 라인으로 이동한다.


Ctrl + Shift + F

ㄴ 선택된 영역 코딩스타일 자동 정렬




Android/View | Posted by 덩치 2014. 4. 15. 10:55

간단한 얼럿다이얼로그 출력

펌 OK (출처 표시), 상업적 이용 NO, 컨텐츠 변경 NO




AlertDialog.Builder builder = new AlertDialog.Builder(mContext)

.setTitle("종료")

.setMessage("프로그램을 종료 하시겠습니까?")

.setPositiveButton("예", new DialogInterface.OnClickListener() {

public void onClick(DialogInterface dlg, int value) {

finish();

}

})

.setNegativeButton("아니요", null);

AlertDialog dialog = builder.create() ;

dialog.show() ;



아니오 버튼에도 리스너를 등록하고싶으면 예 처럼 다이얼로그인터페이스의 클릭리스너를 등록 해 주면 된다.


빌더 옵션에 .addView(view) 를 하면 LayoutInflater로 가져온 뷰를 내용에 셋팅할 수 있다.

펌 OK (출처 표시), 상업적 이용 NO, 컨텐츠 변경 NO




private void getPackageList() {

PackageManager pm = this.getPackageManager();


List<PackageInfo> packs =                   getPackageManager().getInstalledPackages(PackageManager.PERMISSION_GRANTED);

Log.i("TAG", "===================================================");

for (PackageInfo pack : packs) {

Log.d("TAG", "| name    : " + pack.packageName);

      Log.d("TAG", "| package : " + pack.packageName);

      Log.d("TAG", "| version : " + pack.versionName);

}

Log.i("TAG", "===================================================");

}



휴대폰에 설치 된 패키지명과 어플명, 버전을 가져온다.



public void onRemovePackage(String removePackage) {

Uri uri = Uri.fromParts("package", removePackage, null);

Intent intent = new Intent(Intent.ACTION_DELETE, uri);

startActivity(intent);

}


removePackage로 받아 온 패키지명의 어플을 삭제하겠냐는 팝업이 나타나고, 해당 패키지를 삭제한다.


호출은 


onRemovePAckage("com.example.test");




펌 OK (출처 표시), 상업적 이용 NO, 컨텐츠 변경 NO


패키지명을 입력하면 설치 여부를 알려주는 소스코드


PackageInfo pi;  

try {

String strAppPackage = "패키지명 (ex : com.exam.googlemap)";

pi = getPackageManager().getPackageInfo(strAppPackage,  PackageManager.GET_ACTIVITIES);

}

catch (PackageManager.NameNotFoundException e) {

//패키지가 설치되지 않음

}


버전을 구하고싶다면


String str = pi.versionName;




Android | Posted by 덩치 2014. 4. 3. 18:24

스마트앱마스터 자격증의 속셈

펌 OK (출처 표시), 상업적 이용 NO, 컨텐츠 변경 NO

이전에 스마트앱마스터 어플에 대한 글을 썼는데,

http://biig.tistory.com/55


나도 그냥 가서 시험이나 보자는 생각으로 2급을 신청했었다.


개발 툴은 기존에는 mbizmaker가 베이스이고, 추가로 설치할 수 있는 프로그램이 있다면 설치해서 개발하라고 했었는데





조금전에 대한상공회의소에서 전화가 와서 받았더니


채점프로그램과의 호환때문에 개발툴은 엠비즈메이커로만 가능하단다 하하하하하ㅏㅎ하하ㅏ하


뭔이딴경우가 다있는지 모르겠지만 일단 결제는 취소했고 ..


완전 엠비즈 키우기식 자격증인것같은데, 정말 말도안되는 자격증이라고 생각한다.


자격증 따기 전에는 디스하지 않으려고했건만


아니나 다를까 이렇게 대놓고 속셈을 들어낼줄이야 ..


이로써 효용성에 대해서는 결론이 나왔다.


완전 무쓸모 자격증



'Android' 카테고리의 다른 글

앱 개발 자격증 '스마트앱마스터' 자격증 정보  (2) 2014.04.02
Android/소스코드 | Posted by 덩치 2014. 3. 26. 13:21

화면캡쳐 방지 소스코드

펌 OK (출처 표시), 상업적 이용 NO, 컨텐츠 변경 NO

어플 화면이 캡쳐되지 않도록 해달라는 요청을 받고 검색하다가 발견한 소스코드.


불가능할줄 알았는데 api level 1부터 이런게 있었다니 .. 충격


getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE);


정확한 원리는 모르겠는데 몇몇 기종으로 테스트 해 본 결과


어떤 폰에서는 캡쳐기능을 사용할 수 없습니다 라는 토스트를 출력하고


어떤 폰에서는 캡쳐 직전 바로 검은 화면을 띄워서 해당 화면이 캡쳐되도록 하는 듯 하다.



위 코드 한줄만 넣어주면 적용 완료.


특정 영역에서만 캡쳐를 방지하고싶다면, 이외의 영역에는

getWindow().clearFlags(WindowManager.LayoutParams.FLAG_SECURE);

를 추가하면 된다.


참고로 액티비티가 액티브되고 있는 상태에서만 적용. 즉 홈화면으로 나가서 캡쳐를하면 제대로 캡쳐가 된다.


펌 OK (출처 표시), 상업적 이용 NO, 컨텐츠 변경 NO



startActivity(new Intent(android.provider.Settings."액션"));


한줄만 넣어주면 원하는 설정창을 띄워줄 수 있다.


예를들어 GPS설정창을 띄우고 싶은 경우


startActivity(new Intent(android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS));


데이터네트워크 설정창을 띄우고 싶은 경우


startActivity(new Intent(android.provider.Settings.ACTION_DATA_ROAMING_SETTINGS));



이외에도 Settings 하위에 액션들이 많으니 필요한 액션을 찾아서 적용시켜주면 유용하게 쓰일듯 하다.




펌 OK (출처 표시), 상업적 이용 NO, 컨텐츠 변경 NO


JSONObjectJSON형태의 데이터를 관리해 주는 메서드이다.

주의점은 맵의 특성으로 인해 순서를 보장하지 않는다는것. 즉 똑같이 뽑아내도 내용물의 순서가 섞일 수 있다.



간단한 사용법은 다음과 같다.


먼저 제이슨 생성 후 데이터 집어넣기


JSONObject obj = new JSONObject();

obj.put("이름","덩치");

obj.put("거주지","서울");


출력해보면


String data = obj.toString();

System.out.println(data);


결과값 - {"이름":"덩치","거주지":"서울"} 

이렇게 표시된다.


키값에 해당하는 벨류만 뽑고싶다면

String data = obj.get("key");

하면 "key"에 해당하는 벨류를 반환한다.



JSON형태의 StringJSONobject에 넣는법은


String data = {"이름":"덩치","거주지":"서울"};

(실제로는 자바에서는 "를 못읽기때문에  String data = "{\"이름\":\"덩치\",\"거주지\":\"서울\"}";  이런식으로 해줘야 될것임)

JSONObject obj = new JSONObject(data);

쓸때는 위와 같이 뽑아서 사용하면 된다.



JSONArray 는 JSONObject가 들어가는 배열이라고 보면 된다.


예제를 먼저 보자

- 예제출처 : (http://aroundck.tistory.com/215)


String Json = "[{\"Product\" : \"Mouse\", \"Maker\":\"Samsung\", \"Price\":23000},"
               + "{\"Product\" : \"KeyBoard\", \"Maker\":\"LG\", \"Price\":12000},"
               + "{\"Product\":\"HDD\", \"Maker\":\"Western Digital\", \"Price\":156000}]";
try{
   String result = "";
   JSONArray ja = new JSONArray(Json);
   for (int i = 0; i < ja.length(); i++){
      JSONObject order = ja.getJSONObject(i);
      result += "product: " + order.getString("Product") + ", maker: " + order.getString("Maker") +
                  ", price: " + order.getInt("Price") + "\n";
   }
}
catch (JSONException e){ ;}


결과값 :   result : product: Mouse, maker: Samsung, price: 23000
product: KeyBoard, maker: LG, price: 12000
product: HDD, maker: Western Digital, price: 156000

이렇게 만들어진 JSONArray 객체를 JSONObject에 넣을 수 있으며

위와같은 방식으로 제이슨오브젝트에 그냥 오브젝트와 어레이를 모두 넣어가며
작업할 수 있다.






'Android > 입/출력' 카테고리의 다른 글

SharedPreferences 사용법을 알아보자.  (1) 2014.01.14

펌 OK (출처 표시), 상업적 이용 NO, 컨텐츠 변경 NO


작업을 하다가 바이트로 저장된 .dat파일을 수정할 일이 생겼다.


아예 파일을 다시 생성해버릴까 하다가 멘탈을 다잡고 생각해 보니 생각보다 간단한문제였다.


먼저 파일을 열어야 하는데


static public byte [] openUploadPacket(Context ctx, String name) {

String filename = name + "_packet.dat" ;

byte [] list = null ;

try {

File cellFile = ctx.getFileStreamPath(filename);

ObjectInputStream is = new ObjectInputStream(new FileInputStream(

cellFile));

list = (byte []) is.readObject();

is.close();

return list;

} catch (Exception e) {

log.err("openUploadPacket = " + e) ;

return null;

}

}


이렇게하면 바이트배열에 파일의 내용이 전부 들어간다.


( 파일을 저장하는것은 InputStream 대신 OutputStream을 사용해서 write해주면 된다. )



나는 오픈한 파일의 164 ~ 175 번 값을 바꿔줘야 했다.



byte [] packet = Common.openUploadPacket(mContext, workNum) ;

byte [] editByte = et_nis.getText().toString().getBytes();


for (int i = 0; i < editeByte.length; i++) {

packet [164 + i] = editeByte[i];

}


먼저 바이트배열 packet에 파일 읽어온다

그럼 파일의 length만큼 배열크기가 할당되고 데이터가 들어가고,


내가 수정할 데이터가 들어갈 editByte도 하나 만들어줬다.


et_nis라는 EditView에 입력한 값이 저기에 들어가게 될텐데,


et_nis에 어떤 데이터형이 들어갈 지 모르기때문에 일단 스트링으로 받은 다음, getBytes()를 이용해

바이트형식으로 배열에 넣어줬다.


그리고 164번부터 et_nislength만큼 반복을 돌려서 기존 packet 배열에 수정할 데이터 배열을 넣어준다


위와같이 하면 원하는 길이만큼 원하는 데이터로 수정해 줄 수 있다.


소켓통신할 때 자주 사용될 것 같다