레이블이 안드로이드 개발 TIP인 게시물을 표시합니다. 모든 게시물 표시
레이블이 안드로이드 개발 TIP인 게시물을 표시합니다. 모든 게시물 표시

2011년 3월 24일 목요일

Android : AsyncTask

출처 : http://blog.naver.com/schweine7/40112690238

AsyncTask

  : 백그라운드 작업을 하는데 만드는 쓰레드, 핸들러 등을 대신 만들어주는 도우미 클래스


Params : 실행시에 전달할 인수 타입.
Progress : 매 작업 단계마다 진행 상태를 표기하기 위한 타입
Result : 작업 결과로 리턴될 타입


void onPreExecute ()
  -> 작업 시작되기 전 호출. UI 스레드에서 실행. 보통 초기화작업

Result doInBackground (Params ... params)
  -> 배경 작업을 수행. 분리된 스레드에서 실행.
       execute 메서드로 전달한 작업거리가 params 인수로 전달됨. (배열 타입으로)
       하나의 인수만 필요하면 params[0]만 사용
       작업 중에 publishProgress 메서드를 호출하여 작업 경과를 UI 스레드로 보고 가능

void onProgressUpdate (Progress ...values)
  -> doInBackground에서 publicProgress 메서드를 호출할 때 작업 경과 표시를 위해
     호출되며 UI 스레드에서 실행. 프로그래스 바에 진행 상태를 표시하는 역할

void onPostExecute (Result result)
  -> 백그라운드 작업이 끝난 후 UI 스레드에서 실행. 인수로 작업 결과 전달.
      취소되거나 예외 발생시 null 전달

void onCancelled ()
  -> cancel 메서드로 작업 취소했을 때 호출되며 UI 스레드에서 실행



작업 시작할 때는 AsyncTask 객체를 UI 스레드에서 생성한 후 다음 메서드 호출
!! 반드시 UI 스레드에서 호출 !!

AsyncTask <Params, Progress, Result> execute (Params... params)


boolean cancel (boolean mayInterruptIfRunning)
boolean isCancelled()
   -> 작업을 취소하라고 지시.
       작업 시작 전에는 취소 성공한 것으로 return 됨.

Result get([long timeout, TimeUnit unit])
  -> 작업 완료되기까지 대기하며 작업 결과를 돌려 받는다. 타임아웃값 지정 가능

AsyncTask.Status getStatus()
  -> 작업의 현재 상태 조사. 시작되지 않은 상태면 PENDING 리턴. 이미 실행중이면 RUNNING,
      완료되었다면 FINISHED가 리턴




 메인 스레드
작업 스레드 
 execute

onPrepareExecute()
 // 작업 스레드 작동



onProgressUpdate()
// 메인에서 한번 작동

onPostExecute()
// 메인에서 한번 작동

작업 완료

doInBackground(){
   while(){
     //To do
     publishProgress()

   }
   return result;



==================================  ex  ============================================
ProgressDialog mProgress;
new AccumulateTask().execute(100);

class AccumulateTask extends AsyncTask<Integer, Integer, Integer> {
   protected void onPreExecute(){
      mValue = 0;
      mProgress = new ProgressDialog(.this);
      mProgress.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
      mProgress.setTitle("updating");
      mProgress.setMessage("Wait...");
      mProgress.setCancelable(false);
      mProgress.setProgress(0);
      mProgress.setButton("Cancel", new DialogInterface.OnClickListener(){
         public void onClick(DialogInterface dialog, int whichButton){
            cancel(true);
         }
      });
      mProgress.show();
   }

   protected Integer doInBackground(Integer... arg0){
      while (isCancelled() == false){
         mValue++;
         if (mValue <= 100){
            publishProgress(mValue);
         }
         else{
            break;
         }
         try { Thread.sleep(50); } catch (InterruptedException e) { ; }
      }
      return mValue;
   }

   protected void onProgressUpdate(Integer... progress){
      mProgress.setProgress(progress[0]);
      mText.setText(Integer.toString(progress[0]));
   }
  
   protected void onPostExecute(Integer result){
      mProgress.dismiss();
   }

   protected void onCancelled(){
      mProgress.dismiss();
   }
}
=====================================================================================

2011년 3월 17일 목요일

Android : Source 상에서 Margin 값 적용하기

private MarginLayoutParams margin;
margin = new ViewGroup.MarginLayoutParams(/*this.getLayoutParams()*/new LinearLayout.LayoutParams(140, 50));
//setMargins(int left, int top, int right, int bottom)
margin.setMargins( 10, 10, 10,10 );
super.addView(view , new LinearLayout.LayoutParams(margin));

출처 : http://blog.naver.com/lowmans/100123263572

Android : Android pixcel to dpi

final float scale = getContext().getResources().getDisplayMetrics().density;

final float densityDpi = getContext().getResources().getDisplayMetrics().densityDpi;

float pxPerInch = 340; // default value - note it's a new density in API version 9.
switch(densityDpi){
     case DisplayMetrics.DENSITY_LOW:
                 pxPerInch = 120 * scale;
                 break;
     case DisplayMetrics.DENSITY_MEDIUM:
                 pxPerInch = 160 * scale;
                 break;
     case DisplayMetrics.DENSITY_HIGH:
                 pxPerInch = 240 * scale;
                 break;
}

출처 : http://blog.naver.com/lowmans/100123712145

Android : 단말기 정보 확인

TelephonyManager tpMgr = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
String alphName = tpMgr.getNetworkOperatorName();

Log.d("Telephony", "alphName:\t" + alphName); // 통신사
Log.d("", "SDK:" + android.os.Build.VERSION.RELEASE); // 버젼 sdk:2.1-update1
Log.d("", "MODEL:" + android.os.Build.MODEL); // Device Model

출처 : http://blog.naver.com/lowmans/100123923127

Android : 어플실행시키기(Package name으로 액티비티 실행)

Package name으로 액티비티 실행하는 로직.

Intent intent = this.getPackageManager().getLaunchIntentForPackage(packageName);
startActivity(intent);
 

Android : 안드로이드 마켓 License Validation Library 사용하기

[권한]
<uses-permission android:name="com.android.vending.CHECK_LICENSE />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />


[import]
import android.telephony.TelephonyManager;
import com.android.vending.licensing.AESObfuscator;
import com.android.vending.licensing.LicenseChecker;
import com.android.vending.licensing.LicenseCheckerCallback;
import com.android.vending.licensing.ServerManagedPolicy;


[class]
 private class MyLicenseCheckerCallback implements LicenseCheckerCallback { 
    @Override
    public void allow() { 
        if (isFinishing()) { 
            return; 
        } 
        // 라이선스 인증에 성공했을때 수행할 일을 여기에 추가 
    } 
    @Override
    public void applicationError(ApplicationErrorCode errorCode) { 
        // 에러 메시지 출력 등의 루틴 추가 
    } 
    @Override
    public void dontAllow() { 
        if (isFinishing()) { 
            return; 
        } 
        // 라이선스 인증에 실패했을 때 수행할 일을 여기에 추가 
    } 
}

[onCreate]
 public class MainActivity extends Activity { 
     // 2에서 확인한 public key 
     private static final String BASE64_PUBLIC_KEY = "MIIBIjANBgkqhkiG ... ";  
     // 20개의 랜덤한 byte 
     private static final byte[] SALT = {-46, 65, 30, -128, -103, -57, 74, -64, 51, 88, -95,  
                          -45, 77, -117, -36, -113, -11, 32, -64, 89};  
   
     private LicenseCheckerCallback mLicenseCheckerCallback; 
     private LicenseChecker mChecker; 
     @Override
     public void onCreate(Bundle savedInstanceState) { 
         super.onCreate(savedInstanceState); 
   
         // LicenseCheckerCallback 초기화 
         mLicenseCheckerCallback = new MyLicenseCheckerCallback(); 
   
         // 디바이스 아이디를 얻기 위한 루틴 
         TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); 
         String deviceId = tm.getDeviceId(); 
   
         // LicenseChecker 초기화 
         mChecker = new LicenseChecker(  
                 this,  
                 new ServerManagedPolicy(this, new AESObfuscator(SALT, getPackageName(), deviceId)), 
                 BASE64_PUBLIC_KEY); 
   
         // License Validation 실행 
         mChecker.checkAccess(mLicenseCheckerCallback); 
     } 
   
     @Override
     protected void onDestroy() { 
         super.onDestroy(); 
         mChecker.onDestroy(); // 어플리케이션 종료시 메모리 반환 
     } 
}

출처 :  http://techdic.tistory.com/48

Android : 디바이스에 설치된 어플리케이션(액티비티) 목록 얻기

멋진 소스

PackageManager manager = getPackageManager();
List<PackageInfo> appInfoList = manager.getInstalledPackages(PackageManager.GET_UNINSTALLED_PACKAGES);
for (int j = 0, jend = appInfoList.size(); j < jend ; j++) {
   PackageInfo pi = appInfoList.get(j);
}

출처 : http://blog.naver.com/PostView.nhn?blogId=dong277&logNo=130104023606&beginTime=0&jumpingVid=&from=search&redirect=Log&widgetTypeCall=true&topReferer=http%3A%2F%2Fsearch.naver.com%2Fsearch.naver%3Fwhere%3Dnexearch%26sm%3Dies_hty%26ie%3Dutf8%26query%3DgetPackageManager%28%29

Android : 현재 실행 가능한 어플리케이션(액티비티) 목록 얻기

멋진 소스 발견.

PackageManager manager = getPackageManager();


final Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
List<ResolveInfo> resolveInfos = manag.queryIntentActivities(mainIntent, 0);
for (int i = 0, iend = resolveInfos.size(); i < iend; i++) {
   ResolveInfo ri = resolveInfos.get(i);
   String pkgName = ri.activityInfo.applicationInfo.packageName; //패키지 이름
   String className = ri.activityInfo.name; //클래스 이름(실행되는 액티비티 이름)
   ComponentName componentName = new ComponentName(pkgName, className); //컴포넌트 생성 코드
   CharSequence title = ri.loadLabel(manager); //어플리케이션 이름
   Drawable icon = ri.activityInfo.loadIcon(manager); //어플리케이션 아이콘 Drawable
   boolean thirdPartyFlag = false;
   if ((ri.activityInfo.applicationInfo.flags
          & android.content.pm.ApplicationInfo.FLAG_SYSTEM) == 0 ) {
      // 다운로드 받은 어플리케이션
      thirdPartyFlag = true;
   } else {
      // 프리로드된 어플리케이션
   }
   boolean isExternalApp = false;
   if ((info.activityInfo.applicationInfo.flags & android.content.pm.ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0) {
      // 외장메모리에 설치되는 어플리케이션
      isExternalApp = true;
   } else {
      // 내장메모리에 설치되는 어플리케이션
      isExternalApp = false;
   }
}

출처 : http://blog.naver.com/PostView.nhn?blogId=dong277&logNo=130104023606&beginTime=0&jumpingVid=&from=search&redirect=Log&widgetTypeCall=true&topReferer=http%3A%2F%2Fsearch.naver.com%2Fsearch.naver%3Fwhere%3Dnexearch%26sm%3Dies_hty%26ie%3Dutf8%26query%3DgetPackageManager%28%29

Android : 어플리케이션 버전 정보 얻기

어플 배포시 마다 도움말/이번 버전의 갱신 내용등을 보여 줄때 일일이 버전 정보를 수정하였었는데. 아래의 로직으로 쉽게 처리할 수 있을 거 같네요.

AdroindManifest.xml 파일에서 버전 정보를 읽는 로직.

PackageManager pm = getPackageManager();
pm.getPackageInfo(getPackageName(), PackageManager.GET_SIGNATURES).versionName;

출처 : http://techdic.tistory.com/49

2011년 3월 16일 수요일

Android : 네트워크 접속 전에 3G 및 Wife 접속 가능 체크하기.

아래의 로직으로 체크 가능합니다. 이때 AndoridManifest.xml에 권한을 설정하셔야 합니다.

[로직]
ConnectivityManager connec = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);

   if (connec.getNetworkInfo(0).getState() != NetworkInfo.State.CONNECTED
     && connec.getNetworkInfo(1).getState() != NetworkInfo.State.CONNECTED) {
     //원하는 로직 추가.

    return;
   }


[권한]
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>

Android : Title Bar / Notification Bar 없애기

1. 테마로 Title Bar 없애기.
    AndroidManfest.xml안에 Title Bar를 없애기를 원하는 Activity를 아래와 같이 변경합니다.

   <activity android:name="ShowActivity"   android:theme="@android:style/Theme.NoTitleBar">

2. 테마로 Notification Bar 없애기.
    AndroidManfest.xml안에 Title Bar를 없애기를 원하는 Activity를 아래와 같이 변경합니다.

   <activity android:name="ShowActivity"   android:theme="@android:style/Theme.NoTitleBar.Fullscreen">

3. 로직으로 Title Bar를 없애기.
    아래의 로직을 Activity의 onCreate 메소드 안에서 setContentView를 호출하기 전에 넣으면 됩니다.

    requestWindowFeature(Window.FEATURE_NO_TITLE);

4. 로직으로 Notification Bar를 없애기.
    아래의 로직을 Activity 의 onCreate 메소드 안에 넣는다.

    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);