2011년 3월 27일 일요일
2011년 3월 25일 금요일
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가 리턴
================================== 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();
}
}
=====================================================================================
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
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
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
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);
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
<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
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
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
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"/>
[로직]
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);
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);
피드 구독하기:
글 (Atom)