2011년 9월 26일 월요일

p2) 안드로이드 UI 바꾸는 방법.

구글 검색 키가 좀 허덥하긴 하다만... 안드로이드에서 UI changing을 어떻게 해야 할까 고민하다가 찾은게 환경 설정 변수...

SharedPreferences settings = PreferenceManager


.getDefaultSharedPreferences(mContext);

요러코롬. 세팅 메니저 땡겨오고

settings.getBoolean("list", false)

요렇게 땡겨오면 된다.

쓸때는
SharedPreferences.Editor editor = settings.edit();

boolean isList = true;

editor.putBoolean("list", isList);

editor.commit();
 
요렇게.


얘네들을 이용해서 서로 다른 UI를 그려주는 곳에서 약속을 하고 그린 것을 보였다가 안 보였다가 하면서 UI를 바꾸는 것이다.

더 좋은 방법이 있는지는 모르지만.

 혹시 방법이 나오면 포스팅해야겠다.

p2) PNG error...

libpng error: PNG file corrupted by ASCII conversion

이건 PNG 파일이 깨져 있을 때 나는 에러이다.

파일을 열어보니 손상되었다고 나온다.

이것 때문에 안드로이드에서 수많은 리소스 에러가 뜬다.

파일 하나 때문에... apk 파일은 잘못생성되어 실행도 안되고

콘솔에는 수많은 에러가...

2011년 9월 23일 금요일

p2) 자바 중급은 어느 정도 해야 하는 걸까?

Headfirst JAVA의 내용을 읽고 정확하게 객체에 대해서 또, 객체지향적으로 생각하되.

C++과 C의 특성을 알고 접근했을 때도 이해가 되어야 한다.

즉, Object는 void 포인터라는 걸 알아야한다.

아닐 수도 있지만 내게는 아직도 그렇게만 보이네... 오래 전부터 그랬지만.

SCJP 따고 5년이 지났다.

찾아 보니 이젠 오라클에서 하고 돈도 무지 비싸졌다.

또 따자.

그게 중급으로 가는길...

지식은 언제든 사라지지만 자격증이 주는 자신감과 잊어 버렸을 떄

"넌 이정도는 했었잖아" 가 시키는 복습...

그건 남으니까.

2011년 9월 22일 목요일

p3) LG 통신사 절대 안쓴다.

처음 LG 텔레콤을 이용하면서 가격도 저렴하고 번호도 맘에 들었었다.

그렇게 3년을 쓰고 쭉 다른 통신사 것 쓰다가 갤탭 때문에 다시 LG를 쓰고 있는데.

정말 인터넷 느리다.

요즘 4G가 나와서 타사보다 더 빠르다고 광고하는데.

4G 밀어 준다고 3G는 버린걸까?

3개월 동안 매일 속도 테스트를 하는데

1메가는 커녕 200K 넘은 적이 없다.

90%는 100K 밑이다.

늘 끊긴다.

오랜 동안 써봐서 말할 수 있다.

상담원은 다른 통신사에 비해 더 친절한 것 같다.

그렇지만 품질은 LG통신 썩었다.

담엔 아무리 싸게 나와도 좋게 나와도 절대 안쓴다.

5년 넘게 저렇다는 건 이미 윗대가리의 마인드가 썩어 있다는  뜻이겠지.

p3) X 표 연습.

버리기 연습. 조심해야 할 것.

이제는 정형화 하고 구체화하고 정의하기로 했다.

p1) outlook 실행이 안될 때.

첫 실행 중

exchange 계정을 설정하다가...

오류가 났는데 계속해서 실행시 오류가 나서 진입 자체가 안된다.

C:\Program Files\Microsoft Office\Office14 에 들어가서

outlook /resetnavpane 해도 안된다.

outlook.exe options해서 구글링하니.

http://office.microsoft.com/en-us/outlook-help/command-line-switches-for-outlook-2010-HP010354956.aspx

가 뜬다. 근데 결국 안된다.

다시 까는 수 밖엔...

익스체인지 초기 계정으로 설정하지 말자.


댄장 다시 깔아도 안된다 ㅠㅠ

outlook.exe /profiles 로 해결했다.

그러면 프로파일을 다시 만드는데 프로파일이 계정 설정이다.

아놔... 오피스 다 지우고 다시 까는 수고를 하다니...

모르면 컴터가 고생이다.


2011년 9월 20일 화요일

p2) p1->p2로 p1은 windows power user로...

P2는 자바 초급->중급
P1은 windows power user로 변경.

십여년간 리눅서 로서... 열심히 해 봤지만.

이젠 애착이 아니라 집착인 것 같다.

사실 무슨 운영체제든 내가 만든게 아니면 상관없다.

편한 걸 쓸 뿐.

p1) public void startActivities (Intent[] intents)

http://developer.android.com/reference/android/app/Activity.html

public void startActivities (Intent[] intents)


Since: API Level 11 Launch a new activity. You will not receive any information about when the activity exits. This implementation overrides the base version, providing information about the activity performing the launch. Because of this additional information, the FLAG_ACTIVITY_NEW_TASK launch flag is not required; if not specified, the new activity will be added to the task of the caller.



This method throws ActivityNotFoundException if there was no Activity found to run the given Intent.



Parameters

intents The intents to start.



Throws

android.content.ActivityNotFoundException



See Also

startActivityForResult(Intent, int)




2011년 9월 16일 금요일

life) 센트죄르지 얼베르트

구글 로고 오렌지 있어서 찾아 보니 비타민 C 발견한 생화학자란다.

2011년 9월 15일 목요일

p1) 이클립스 UI perspective 깨졌을 때.

워크 스페이스를 바꾸면 된다.

새로 워크 스페이스를 지정하면 .metadata 밑에 .plugin밑에 몇개 폴더가 생성된다.

ui workbench 라는 폴더도 보이고 ui 뭐시기 등등...

그걸 원래 워크 스페이스에 덮어쓰면 다시 처음으로 돌아온다.

resource 뭐시기도 있는데 그거 덮어쓰면 왠지 프로젝트들도 다시 다 땡겨와서

생성해야 할 것 같아서 그러지 못했다.

이클립스 4.1 버그 있네 ㅡㅡ; UI가 깨지다니...

perspective에서 null pointer exception

2011년 9월 13일 화요일

p1) java에서 #define 이 없을 때 디버깅 코드 넣기.

java에서 static class는 내부 클레스 밖에 없다.  static 클래스란게 아예 있으면
new를 안하고 쓸 수 있을텐데 하고 생각했다. static innerclass 의 경우에도 new를
해서 써야 하고 그건 공유 메모리 정도로 생각해야 한다. -> 사실 아닐수도 있지만
내가 알고 있는 지식은 이렇다.

하지만 멤버 static 변수는 바로 액세스가 가능하니까





public class LogOnOff {


private static final boolean onDebugging = false;


public static boolean isOndebugging() {

return onDebugging;

}

/**

*

*/

public LogOnOff() {

}

}


요런식으로 클래스를 하나 만들고 다른 곳에서는

 private boolean mLogOnOff = LogOnOff.isOndebugging();

이런식으로 정의해서 땡겨 쓰면 하나의 클래스에서 모든 클레스에 대하여
debug msg on/off가 가능하다.

if(mLogOnOff) {
}

로 감싸줘서 코드가 좀 거시기 해지는 감은 있지만.

DDMS를 쓰면서 스탑 포인트가 안 걸리는 서비스쪽 프로그래밍 하기엔 디버깅 코드 만한것이 없다.

차 후 더 좋은 방법이 나오면 포스팅해야 겠다(왠지 있을 것 같아 ㅠ)

p1) cmd창 크게 하기

cmd창은 최대화를 해도 width는 커지지 않는다.

cmd창 제목좌측에서 우클릭하고 속성에 들어가면 레이아웃 탭이

있다. 거기서 조절 해주면 크게 나온다.

adb shell로 폴더 검색할 때 좀 짜증났는데

이젠 좀 시원시원 해졌다.

2011년 9월 7일 수요일

p1) 이클립스 오류 이동 단축키

Ctrl + >   and <

정말 유용하다.

블로깅하고 찾기 쉽게 제목 잘 달아야지

eclipse error tag moving

p1) 이벤트 처리 예제

    public void buttonPressProcessingExamples(final ImageButton imageButton) {


this.mPrevButton = imageButton;



imageButton.setOnKeyListener(new View.OnKeyListener() {

public boolean onKey(View viewInstance, int key, KeyEvent event) {

if (key == KeyEvent.KEYCODE_ENTER



key == KeyEvent.KEYCODE_DPAD_CENTER) {

if (event.getRepeatCount() != 0)

return false;



Rect r = new Rect();

viewInstance.getFocusedRect(r);

MotionEvent motionEvent = null;

motionEvent = MotionEvent.obtain(event.getDownTime(),

event.getEventTime(), MotionEvent.ACTION_DOWN,

r.exactCenterX(), r.exactCenterY(),

event.getMetaState());



if (event.getAction() == MotionEvent.ACTION_UP) {

motionEvent.setAction(MotionEvent.ACTION_UP);

}



viewInstance.dispatchTouchEvent(motionEvent);

}



return false;

}

});



imageButton.setOnTouchListener(new View.OnTouchListener() {

public boolean onTouch(View v, MotionEvent event) {

if(bIsSkipFlingEvent == true){

return false;

}

switch (event.getAction()) {

case MotionEvent.ACTION_DOWN:

mGuiHandler.sendEmptyMessageDelayed(EmailServiceControl.ACTION1, 300);

break;



case MotionEvent.ACTION_CANCEL:

if (mGuiHandler.hasMessages(EmailServiceControl.ACTION1)) {

mGuiHandler.removeMessages(EmailServiceControl.ACTION1);

}else{

LongPressAction();

}

break;

}

return false;

}

});



imageButton.setOnFocusChangeListener(new View.OnFocusChangeListener() {

public void onFocusChange(View arg0, boolean hasFocus) {

if(hasFocus==false && mREWLongPressed){

LongPressAction();

}

}

});

}

p1) CursorLoader

/*


* Copyright (C) 2010 The Android Open Source Project

*

* Licensed under the Apache License, Version 2.0 (the "License");

* you may not use this file except in compliance with the License.

* You may obtain a copy of the License at

*

* http://www.apache.org/licenses/LICENSE-2.0

*

* Unless required by applicable law or agreed to in writing, software

* distributed under the License is distributed on an "AS IS" BASIS,

* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

* See the License for the specific language governing permissions and

* limitations under the License.

*/



package android.content;



import android.database.ContentObserver;

import android.database.Cursor;

import android.net.Uri;



import java.io.FileDescriptor;

import java.io.PrintWriter;

import java.util.Arrays;



/**

* A loader that queries the {@link ContentResolver} and returns a {@link Cursor}.

* This class implements the {@link Loader} protocol in a standard way for

* querying cursors, building on {@link AsyncTaskLoader} to perform the cursor

* query on a background thread so that it does not block the application's UI.

*

*
A CursorLoader must be built with the full information for the query to

* perform, either through the

* {@link #CursorLoader(Context, Uri, String[], String, String[], String)} or

* creating an empty instance with {@link #CursorLoader(Context)} and filling

* in the desired paramters with {@link #setUri(Uri)}, {@link #setSelection(String)},

* {@link #setSelectionArgs(String[])}, {@link #setSortOrder(String)},

* and {@link #setProjection(String[])}.

*/

public class CursorLoader extends AsyncTaskLoader {

final ForceLoadContentObserver mObserver;



Uri mUri;

String[] mProjection;

String mSelection;

String[] mSelectionArgs;

String mSortOrder;



Cursor mCursor;



/* Runs on a worker thread */

@Override

public Cursor loadInBackground() {

Cursor cursor = getContext().getContentResolver().query(mUri, mProjection, mSelection,

mSelectionArgs, mSortOrder);

if (cursor != null) {

// Ensure the cursor window is filled

cursor.getCount();

registerContentObserver(cursor, mObserver);

}

return cursor;

}



/**

* Registers an observer to get notifications from the content provider

* when the cursor needs to be refreshed.

*/

void registerContentObserver(Cursor cursor, ContentObserver observer) {

cursor.registerContentObserver(mObserver);

}



/* Runs on the UI thread */

@Override

public void deliverResult(Cursor cursor) {

if (isReset()) {

// An async query came in while the loader is stopped

if (cursor != null) {

cursor.close();

}

return;

}

Cursor oldCursor = mCursor;

mCursor = cursor;



if (isStarted()) {

super.deliverResult(cursor);

}



if (oldCursor != null && oldCursor != cursor && !oldCursor.isClosed()) {

oldCursor.close();

}

}



/**

* Creates an empty unspecified CursorLoader. You must follow this with

* calls to {@link #setUri(Uri)}, {@link #setSelection(String)}, etc

* to specify the query to perform.

*/

public CursorLoader(Context context) {

super(context);

mObserver = new ForceLoadContentObserver();

}



/**

* Creates a fully-specified CursorLoader. See

* {@link ContentResolver#query(Uri, String[], String, String[], String)

* ContentResolver.query()} for documentation on the meaning of the

* parameters. These will be passed as-is to that call.

*/

public CursorLoader(Context context, Uri uri, String[] projection, String selection,

String[] selectionArgs, String sortOrder) {

super(context);

mObserver = new ForceLoadContentObserver();

mUri = uri;

mProjection = projection;

mSelection = selection;

mSelectionArgs = selectionArgs;

mSortOrder = sortOrder;

}



/**

* Starts an asynchronous load of the contacts list data. When the result is ready the callbacks

* will be called on the UI thread. If a previous load has been completed and is still valid

* the result may be passed to the callbacks immediately.

*

* Must be called from the UI thread

*/

@Override

protected void onStartLoading() {

if (mCursor != null) {

deliverResult(mCursor);

}

if (takeContentChanged()

mCursor == null) {

forceLoad();

}

}



/**

* Must be called from the UI thread

*/

@Override

protected void onStopLoading() {

// Attempt to cancel the current load task if possible.

cancelLoad();

}



@Override

public void onCanceled(Cursor cursor) {

if (cursor != null && !cursor.isClosed()) {

cursor.close();

}

}



@Override

protected void onReset() {

super.onReset();



// Ensure the loader is stopped

onStopLoading();



if (mCursor != null && !mCursor.isClosed()) {

mCursor.close();

}

mCursor = null;

}



public Uri getUri() {

return mUri;

}



public void setUri(Uri uri) {

mUri = uri;

}



public String[] getProjection() {

return mProjection;

}



public void setProjection(String[] projection) {

mProjection = projection;

}



public String getSelection() {

return mSelection;

}



public void setSelection(String selection) {

mSelection = selection;

}



public String[] getSelectionArgs() {

return mSelectionArgs;

}



public void setSelectionArgs(String[] selectionArgs) {

mSelectionArgs = selectionArgs;

}



public String getSortOrder() {

return mSortOrder;

}



public void setSortOrder(String sortOrder) {

mSortOrder = sortOrder;

}



@Override

public void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) {

super.dump(prefix, fd, writer, args);

writer.print(prefix); writer.print("mUri="); writer.println(mUri);

writer.print(prefix); writer.print("mProjection=");

writer.println(Arrays.toString(mProjection));

writer.print(prefix); writer.print("mSelection="); writer.println(mSelection);

writer.print(prefix); writer.print("mSelectionArgs=");

writer.println(Arrays.toString(mSelectionArgs));

writer.print(prefix); writer.print("mSortOrder="); writer.println(mSortOrder);

writer.print(prefix); writer.print("mCursor="); writer.println(mCursor);

writer.print(prefix); writer.print("mContentChanged="); writer.println(mContentChanged);

}

}

p1) CursorWrapper

/*


* Copyright (C) 2006 The Android Open Source Project

*

* Licensed under the Apache License, Version 2.0 (the "License");

* you may not use this file except in compliance with the License.

* You may obtain a copy of the License at

*

* http://www.apache.org/licenses/LICENSE-2.0

*

* Unless required by applicable law or agreed to in writing, software

* distributed under the License is distributed on an "AS IS" BASIS,

* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

* See the License for the specific language governing permissions and

* limitations under the License.

*/



package android.database;



import android.content.ContentResolver;

import android.net.Uri;

import android.os.Bundle;



/**

* Wrapper class for Cursor that delegates all calls to the actual cursor object. The primary

* use for this class is to extend a cursor while overriding only a subset of its methods.

*/

public class CursorWrapper implements Cursor {



private final Cursor mCursor;



public CursorWrapper(Cursor cursor) {

mCursor = cursor;

}



/**

* @return the wrapped cursor

*/

public Cursor getWrappedCursor() {

return mCursor;

}



public void close() {

mCursor.close();

}



public boolean isClosed() {

return mCursor.isClosed();

}



public int getCount() {

return mCursor.getCount();

}



public void deactivate() {

mCursor.deactivate();

}



public boolean moveToFirst() {

return mCursor.moveToFirst();

}



public int getColumnCount() {

return mCursor.getColumnCount();

}



public int getColumnIndex(String columnName) {

return mCursor.getColumnIndex(columnName);

}



public int getColumnIndexOrThrow(String columnName)

throws IllegalArgumentException {

return mCursor.getColumnIndexOrThrow(columnName);

}



public String getColumnName(int columnIndex) {

return mCursor.getColumnName(columnIndex);

}



public String[] getColumnNames() {

return mCursor.getColumnNames();

}



public double getDouble(int columnIndex) {

return mCursor.getDouble(columnIndex);

}



public Bundle getExtras() {

return mCursor.getExtras();

}



public float getFloat(int columnIndex) {

return mCursor.getFloat(columnIndex);

}



public int getInt(int columnIndex) {

return mCursor.getInt(columnIndex);

}



public long getLong(int columnIndex) {

return mCursor.getLong(columnIndex);

}



public short getShort(int columnIndex) {

return mCursor.getShort(columnIndex);

}



public String getString(int columnIndex) {

return mCursor.getString(columnIndex);

}



public void copyStringToBuffer(int columnIndex, CharArrayBuffer buffer) {

mCursor.copyStringToBuffer(columnIndex, buffer);

}



public byte[] getBlob(int columnIndex) {

return mCursor.getBlob(columnIndex);

}



public boolean getWantsAllOnMoveCalls() {

return mCursor.getWantsAllOnMoveCalls();

}



public boolean isAfterLast() {

return mCursor.isAfterLast();

}



public boolean isBeforeFirst() {

return mCursor.isBeforeFirst();

}



public boolean isFirst() {

return mCursor.isFirst();

}



public boolean isLast() {

return mCursor.isLast();

}



public int getType(int columnIndex) {

return mCursor.getType(columnIndex);

}



public boolean isNull(int columnIndex) {

return mCursor.isNull(columnIndex);

}



public boolean moveToLast() {

return mCursor.moveToLast();

}



public boolean move(int offset) {

return mCursor.move(offset);

}



public boolean moveToPosition(int position) {

return mCursor.moveToPosition(position);

}



public boolean moveToNext() {

return mCursor.moveToNext();

}



public int getPosition() {

return mCursor.getPosition();

}



public boolean moveToPrevious() {

return mCursor.moveToPrevious();

}



public void registerContentObserver(ContentObserver observer) {

mCursor.registerContentObserver(observer);

}



public void registerDataSetObserver(DataSetObserver observer) {

mCursor.registerDataSetObserver(observer);

}



public boolean requery() {

return mCursor.requery();

}



public Bundle respond(Bundle extras) {

return mCursor.respond(extras);

}



public void setNotificationUri(ContentResolver cr, Uri uri) {

mCursor.setNotificationUri(cr, uri);

}



public void unregisterContentObserver(ContentObserver observer) {

mCursor.unregisterContentObserver(observer);

}



public void unregisterDataSetObserver(DataSetObserver observer) {

mCursor.unregisterDataSetObserver(observer);

}

}

p1) eclipse 4.1

Unable to read repository at https://dl-ssl.google.com/android/eclipse/content.xml.


sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target





이클립스 4.1에 안드로이드 플러그인을 깔려고 하니 위와 같은 에러가 났다.



https를 http로 바꾸어 주면 된다.



http://dl-ssl.google.com/android/eclipse/





냠냠 4.1은 안정성이 좀 나으려나.
http://www.eclipse.org/downloads/download.php?file=/e4/sdk/drops/R-4.1-201106201631/eclipse-SDK-4.1-win32.zip

p1) aidl 만들기.

Iaidl.aidl을 만든다.

package com.hello;

interface Iaidl {

int add(int a,int b);

}



gen에 Iaidl.java가 자동 생성된다. 

안되면,

Alt + P, N 하면 리소스 다시 만들면서

Iaidl.java가 gen 폴더에 만들어 진다.





 

 
서비스를 만든다.
 
 
AidlService.java
 
 
 
package com.hello;




import android.app.Service;

import android.content.Intent;

import android.os.IBinder;

import android.os.RemoteException;



public class AidlService extends Service {



public void onCreate() {

super.onCreate();

}

@Override

public IBinder onBind(Intent arg0) {

// TODO Auto-generated method stub

// if (aidl.class.getName().equals(arg0.getAction())) {

return mBinder;  // 주석들을 풀어야 한다. 이해되면.

// }

// return null;

}



private Iaidl.Stub mBinder = new Iaidl.Stub() {

@Override

public int add(int a, int b) throws RemoteException {

return a+b; // 서비스에서 aidl 스텁 함수의 본체가 있다.

}

};

}

 
 
즉, aidl에서 뭘 쓰겠다 라고 선언한 것의 함수 본체는 서비스에 있다고 보면 된다.
 
service 실행을 위해서는 androidmanifest에
 



































 
요렇게 서비스가 들어가야 한다. 아님 다른 곳에서 계속 실행 시키고 있던가.
 
 
AidlDEMO.java 는 이렇다.
 
 
package com.hello;


import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
import android.widget.Toast;

import com.hello.Iaidl;

public class AidlDEMO extends Activity {

Iaidl maidl=null;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

Intent intent = new Intent(this, AidlService.class);
bindService(intent, srvConn, BIND_AUTO_CREATE);

// TODO Auto-generated catch block
}


ServiceConnection srvConn = new ServiceConnection() {

@Override
public void onServiceConnected(ComponentName arg0, IBinder arg1) {
// TODO Auto-generated method stub
maidl = Iaidl.Stub.asInterface(arg1);

Integer d = null;

try {
d = maidl.add(1, 2);
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

Toast.makeText(AidlDEMO.this, d.toString(), Toast.LENGTH_SHORT).show();
}

@Override
public void onServiceDisconnected(ComponentName arg0) {
// TODO Auto-generated method stub
maidl = null;
}
};

}
 
 
 이렇게 쓴다는 정도만. 포스팅.

간단히 정리하면

1. aidl에서 쓸 함수 인터페이스 정의하고 -> 그럼 더비 stub 함수가 만들어짐.

2. AIDL이름.stub mBiner = new AIDL이름.stub() {
 aidl안에 있는 함수 애들
}
로 본체를 정의해 주면 된다.
stub함수 쓸 때 이클립스의 Ctrl+1 기능을 활용하면 aidl참고해서 자동으로 만들어 준다.


3. 서비스에서는 onBind에 return값을 Strub 함수의 binder 값으로 정한다.


사용법은
http://www.kandroid.org/guide/developing/tools/aidl.html
에 나와있다.

getApplicationContext().bindService(intent, svcConn, BIND_AUTO_CREATE);

처럼 해주면 되는데
위 링크에서 찾아 보면 intent는 서비스 이름이고
svcConn은 ServiceConnection로 서비스에 연결되거나 끊겼을 때 xxx.Stub.asInterface로 해당 인터페이스를 땡겨오는 핵심 부분이 들어 있다.

나머지는 연습해야 한다. 개삽질을 통해서 내것으로 만들자.

ㅠㅠ

백문이 불여일타.

1. AIDL을 통해 다른 process에서 service와 통신
http://jusung.springnote.com/pages/5626531

2.Stub
http://terms.co.kr/stub.htm

3.Intent filter(승현)
http://androidhuman.tistory.com/entry/%EB%82%B4%EA%B0%80-%EB%88%84%EA%B5%B0%EC%A7%80-%EB%A7%90%ED%95%B4%EC%A4%98-%EC%9D%B8%ED%85%90%ED%8A%B8-%ED%95%84%ED%84%B0-Intent-Filter


4.안드로이드 AIDL 을 통해 서로 다른 Process에서 Service 와 통신 하기
http://huewu.blog.me/110083320332?Redirect=Log

5.서비스에 대한 고찰
http://cancle-ysj.tistory.com/54

6.서비스, 스레드 설명
http://www.androidpub.com/102370

7.remote service 만들기 순서
http://blog.daum.net/urlover/17049886

8.AIDL 이란?
http://linux.springnote.com/pages/5939095

9.AIDL 공식 홈피
http://www.kandroid.org/guide/developing/tools/aidl.html

10 서로 다른 앱 (보안)
http://www.ibm.com/developerworks/kr/library/x-androidsecurity/index.html


p1) 이클립스 단축키

원작자 & 출처 : http://blog.outsider.ne.kr/243
감사합니다.



Editing





Ctrl + D : 줄 삭제

Ctrl + Alt + 위/아래 : 줄 복사

Ctrl + Shift + Enter : 현재 줄에 새줄 추가

Shift + Enter : 다음줄에 새줄 추가

Ctrl + Right : 다음문자로 이동 (Ctrl + Left : 이전 문자로 이동 )

Ctrl + Shift + / : 주석처리 (Ctrl + Shit + \ 주석 풀기)

Ctrl + / : 라인별로 주석처리

Ctrl + Shift + O : import 정리

Ctrl + L : 원하는 라인으로 이동

Alt + Shift + 방향키 : 블록선택하기

Ctrl + J : 점증적 검색 - Ctrl + J 입력후 원하는 단어 입력하면 이클립스 하단바에 찍히고 바로 검색 가능

Ctrl + K : 다음 찾기(Ctrl + Shift + K 이전 찾기) - 현재 블럭설정된 단어 찾기

Ctrl + H : 검색 다이얼로그(메서드, 타입, 패키지 등 검색 가능)

Tab : 들여쓰기 (Shift + Tab : 내어쓰기)

Ctrl + Space : 코드어시스트 (키보드 Type3를 쓸 경우에는 왼쪽 Ctrl을 누른 상태에서 오른쪽 Ctrl을 누르고 왼쪽 Ctrl을 뗀 후에(오른쪽 Ctrl은 누른 상태) Space를 눌러준다.)

Shift + Alt + T : 리펙토링 메뉴 띄우기









Navigation





Ctrl + Shift + E : 에디터안에서 열린 파일간의 이동

Ctrl + E : 에디터안에서 열린 파일간의 이동(작은 레이어로 뜬다.)

Ctrl + F6 : 에디터안에 열링 파일간 이동하는데 F6누를때마다 하나씩 순차적으로 넘어감.



Ctrl + E : 퀵 에디터간 이동

Ctrl + F7 : 뷰간 전환

Ctrl + F8 : 퍼스펙티브 간 전환

F12 : 어디서든 에디터로 포커스 됨







Information







Ctrl + Shift + R : 리소스 찾기

Ctrl + O : 레이어로 현재파일의 Outline 보여줌

Ctrl + T : 레이어로 계층구조 보여줌

Ctrl + Shift + Space : 메서드의 괄호안에서 누르면 파라미터 타입 볼 수 있음.

Ctrl + 1 : 에러난 곳(빨간 줄 표시)에서 누르면 레이어로 해결방법이 나옴.

F3 : 해당 메서드나 클래스가 정의된 곳으로 이동

Ctrl + Shift + G : 해당 메서드, 객체, 변수가 사용(호출)된 모든 곳을 찾는다.









etc...





Ctrl + Shift + L : 단축키 리스트

Ctrl + 3 : Quick Access

Ctrl + M : 화면 최대화

Ctrl + W : 파일에디터 닫기

Alt + Shift + X, R : Run on Server

F11 or Ctrl + F11 : 최근 실행한 Run 실행



p1) 이클립스에서 텍스트 검색하기

소스인사인트의 Find in reference 기능을 이클립스 에서도 이용해 보자.




menu - Window - Preferences - General - keys



에서



category별로 정렬



Search 카테고리 쪽으로 이동



Find Text in File선택



Binding Textbox에서 Ctrl+/ 누름.



저장하면 이제부터 단어 위에서 Ctrl+/만 하면
서치창에 걍 뜬다.
 
소스 인사이트만큼 속도가 빠르진 않지만 괜찮은 기능.

p1) cursor

수원 맛집 소스 코드의 일부이다. credits 에 toast 팝업으로 명언을 띄워주는..

DB에서 안 가지고 온 것은 애드워드 기번의 명언이 default로 나온다.


package com.b.team.food;




import java.util.*;



import android.app.*;

import android.content.*;

import android.database.*;

import android.database.sqlite.SQLiteDatabase;

import android.database.sqlite.SQLiteDatabase.CursorFactory;

import android.database.sqlite.SQLiteOpenHelper;

import android.graphics.*;

import android.os.*;

import android.provider.*;

import android.view.*;

import android.widget.*;

import android.widget.AdapterView.OnItemClickListener;



public class FCredits extends Activity {



Context mContext;

WordDBHelper mHelper;

EditText mText;



public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

mContext = this;

setContentView(R.layout.credits);

mHelper = new WordDBHelper(this); //디비에서 가지고 오는 건 쉽다.

SQLiteDatabase db = mHelper.getReadableDatabase(); // 요러면 땡

Cursor cursor;

String vRand = String.valueOf((int)(Math.random()*1617 + 561)); //명언을 랜덤하게 뽑는다.


cursor = db.rawQuery("SELECT quote, author FROM Quote WHERE _id="+vRand , null);
//쿼리 날려서 커서에 넣는다. 랜덤 아이디 것만 뽑아온다.



String Result = "";


// 커서는 배열 비스무리 한건가봐 moveToNext가 먹는걸 보니. 아님 칼럼의 내용이 하나씩 들어가나?
while(cursor.moveToNext()) {

String vQuote = cursor.getString(0);

String vAuthor = cursor.getString(1);

Result += (vQuote + "" + vAuthor +"\n");

}



if(Result.length() == 0) {

Result =("* 진보하지 않는 모든 것은 퇴보한다. 애드워드 기번 *");

}

else {

//NULL Pointer Error mText.setText(""+Result);

}



Toast.makeText(FCredits.this, (CharSequence) Result, Toast.LENGTH_LONG).show();

cursor.close();

mHelper.close();



}







class WordDBHelper extends SQLiteOpenHelper {



public WordDBHelper(Context context) {

super(context, "history.db", null, 1);

// TODO Auto-generated constructor stub

}



@Override

public void onCreate(SQLiteDatabase db) {

// TODO Auto-generated method stub



}



@Override

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

// TODO Auto-generated method stub



}



}



}

---------------------------------------------------------------------------------------------------
 
http://androidhuman.tistory.com/210 글이 도움이 된다.
 
커서는 쿼리(질의) 결과로 나온 레코드들을 가리키는, 말 그대로 마우스 "커서" 처럼 특정 레코드를 가리키는 역할을 합니다. 결과 레코드가 여러 개일 경우, 커서를 이리저리 움직이면서 여러 레코드들의 데이터들을 받아올 수 있습니다.




커서는 레코드를 가리키는 인터페이스 였다. 포인터도 맞는 표현일지도. 가리키는 혹은 레코드를 가리키는 주소니까... 메모리상은 아니지만.
matrixcursor는 http://susemi99.tistory.com/749 의 소스를 보면
칼럼 위치를 바꾸어서 레코드를 다시 구성할 때 쓰이는 것으로 보인다.

2011년 9월 6일 화요일

p1] An error has occurred. See error log for more details.

eclipse -clean

으로 이클립스를 한번 실행해 주면 된다.

p1] 이클립스 TODO list

이클립스 메뉴에서 window - show view - tasks를 선택하면 TODO list를 볼 수 있다.

주석으로

//TODO: 오늘은 이거 해야지

라고 하면

TODO list에 자동으로 추가 되어 언제든 볼 수 있다.

단 TODO list 갱신은 빌드해야 된다. refresh 기능이 없다.

p1] 이클립스의 찾기 기능

sourceInsight의 Ctrl + /과 맞먹는

Ctrl + H 기능....

사실 소스인사이트가 더 좋긴 하다.

Ctrl + H 로는 다 안 찾아지니 java Search랑 File search 두 탭 모두 이용해야 한다.

Ctrl + H 의 File search는 grep과 흡사하다.

p1] p2, p4 통합. -> 안드로이드 중급 프로젝트.

SCJP 5.0따고 허송 세월 보냈으니 이제 실력은 다시 제자리. 초급.

중급으로 올리기 위한 project를 시작. 당근 android 뽕짝해서.

Log.e(TAG, "asdfasf");

는 DDMS에서

tag:TAG

로 찾을 수 있다.

tag하고 똔똔 하고 TAG명

ex ) tag:myerror

2011년 9월 5일 월요일

p1] 프로젝트 세모로 종료.

두달 여간 10Kg 정도 감량하여 프로젝트를 종료한다.

웨딩 촬영이 끝났기 때문도 있고.

더 이상 프로젝트를 망치기 전에 종료해야 할 것 같다.

사실 촬영 전날에 수제 왕 돈까스를 먹지 않았으면 대 성공이었겠지만.

수제 왕 돈까스를 먹고 얼굴도 붓고 다음 날 바로 몸무게 2Kg 불은 상태에서의

촬영이라 사실상 실패로 봐야 하겠다.

그러나 가만히 생각해 보니 입맛도 예전과는 많이 바뀌고 사실 빠진 것은 사실이기 때문에

나에게 주는 상이라고 해야할까?

선방 했다는 정도?

턱걸이는 17개까지 갔는데 돈까지 먹은 날 해보니 14개 밖에 안되더라 ㅠㅠ 슬픔. 다시 내려왔어.

악력기는 20kg로 120까지 했는데 다시 하면 90~110 일 것 같다.

대충 이정도의 성과? 평행봉은 15개 정도로 올린 것 같다.

물론, 한번에 하는 것. 한번에 하기 위해서는 전날 여러번 운동하고 영양 관리도 해야 한다.

프로젝트 종료 후 일주일 정도는 쉬려고 한다.

맥주도 먹고 술도 마시고 먹고 싶었던 것 마음 껏 먹자.

이번 프로젝트에서 확실히 안 사실은.

내가 생각보다 의지력이 강하지 않다는 것이다. 촬영 일틀간 빡시게 굶었으면

아마 12kg 감량 상태에 얼굴도 홀쭉한 상태에서 사진을 찍었을 것이다.

뭐 긍정적으로 생각하면 신부에게는 좋은 비교 시료가 된 셈.

p3] P3 프로젝트는 실패로 종료한다.

 P3 프로젝트의 취지는 그랬다.

세상은 원래 힘든 것이니까 계속 웃으면서만 살자고.

그리고 정말 세상을 아니까 거기서 한발 더 나아가 웃으며 사는게 답이라고.

우선 실패의 이유는 내가 아직 그만한 큰 그릇이 안된다는 것이 첫번째 이유다.

그래서 공부를 많이 해야겠다는 생각이 들었다. 아직 이 프로젝트를 완수하기 힘들다는

생각이 들었다. 더군다나 내가 진정 이것을 원하는지도 의문이 들 정도라 방법을

바꾸어 끊임없이 다시 시도해 볼 수도 없게 되었다.

두번째는 살다보니 웃을일도 있고 울 일도 있는데 웃고만 살 수는 없다는 생각도 들었다.

이것 역시 첫번째 이유에 기인하는 것이다. 세상 탓하고 있으니 말이다.

그리고 요즘 좋은 일도 많지만 그렇지 않은 일도 정말 많다.

사람에게 내 인생의 목적을 두다보니 안되는 일도 너무 많고.

그래서 사람이 아닌 다른 무언가와 그리고 나 자신에게 목적을 두려고 하고 있다.

그리고 지금은 맥주 한잔 하면서 프로젝트 실패에 대한 아픔을 곱씹고 있다.

다음엔 성공하리라 하는 다짐이 있다면 프로젝트 실패로 두지 않을텐데.

왜 웃고만 살아야 하는지 모르겠다. 내가 어떤 이미지로 다른 사람에게 도움을 주는

연예인도 아닌데.

끝으로 지금은 다른 맥주를 마시고 있지만... 독일의 모든 맥주와 일본 아사히, 한국은 맥스가 맥주 중에서는 가장 나은 것 같다. 나인브로이에서 만드는 제조 맥주나 환상적인 액기스 조합으로 시원함을 만들어 내는 곳곳의 맥주 전문점 집도 그렇긴 하다.

bootcamp 지우기

맥북 프로 레티나 터치바 diskutility 에서 bootcamp 파티션 삭제하면 검은색에서 회색으로 바뀐다(APFS로 지정) 파틴션 아이콘 클릭하여 - 버튼을 이용하여 삭제하면 끝.