file 로 부터 읽어서 cursor 를 직접 만든다.



    private Cursor getSuggestions(String query, String[] projection) {
        String processedQuery = query == null ? "" : query.toLowerCase();
        List<Dictionary.Word> words = Dictionary.getInstance().getMatches(processedQuery);

        MatrixCursor cursor = new MatrixCursor(COLUMNS);
        long id = 0;
        for (Dictionary.Word word : words) {
            cursor.addRow(columnValuesOfWord(id++, word));
        }

        return cursor;
    }

  private Object[] columnValuesOfWord(long id, Dictionary.Word word) {
        return new Object[] {
                id,                  // _id
                word.word,           // text1
                word.definition,     // text2
                word.word,           // intent_data (included when clicking on item)
        };
    }





by 수영사랑 | 2010/12/21 16:59 | 12/20~12/23 | 트랙백(41061) | 덧글(0)

searchable.xml



<searchable xmlns:android="http://schemas.android.com/apk/res/android"
        android:label="@string/search_label"
        android:searchSettingsDescription="@string/settings_description"
        android:includeInGlobalSearch="true"
        android:searchSuggestAuthority="dictionary"   // search manager 에서 사용할 content provider 를 넣는다.
        android:searchSuggestIntentAction="android.intent.action.VIEW">  // search 가 끝나는 순간 ACTION_VIEW 가 온다.
</searchable>


by 수영사랑 | 2010/12/21 16:35 | 12/20~12/23 | 트랙백 | 덧글(0)

onCreate(Bundle savedInstanceState)


process 가 메모리 부족등으로 kill 된 후에 다시 복원 될 때, savedInstanceState 정보를 가지고

자동으로 복원해 준다.


하지만 안드로이드 UI 가 아닌 사용자 UI 의 경우 (게임 등) 복원하는 코드가 들어가야 함.


 

예를 들어, Activity가 처음 실행돼서 사용자에게 사용되다 정상 종료 된다면 다음과 같은 callback이 차례로 호출된다.

onCreate(Bundle) -> onStart() -> onResume() -> onPause() -> onStop() -> onDestory()

 

 

또, Running상태의 Activity A가 다른 Activity B에게 완전히 가렸다 A가 다시 foreground로 와서 사용자에게 사용되는 경우는 다음과 같은 callback이 차례로 호출된다.

onSaveInstanceState(...) -> onPause() -> onStop() -> onRestart() -> onStart() ->onResume()

 

 

마지막 예로, 화면의 일부가 가린 pause 상태의 Activity A가 system 자원(메모리)의 부족으로 system에 의해 강제로 종료 당했다가 system 자원의 여유가 생겨 다시 복구 될 때는 다음과 같은 callback이 차례로 호출된다.

강제종료 -> onCreate(…) -> onStart() -> onRestoreInstanceState(...) -> onResume()

 

 





public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

  
        if (savedInstanceState == null) {
            // We were just launched -- set up a new game
            mSnakeView.setMode(SnakeView.READY);
        } else {
            // We are being restored
         // 안드로이드 UI 가 아니기 때문에 복원하는 코드가 들어간다. 안드로이드 UI 는 자동 복원됨.
            Bundle map = savedInstanceState.getBundle(ICICLE_KEY);
            if (map != null) {
                mSnakeView.restoreState(map);
            } else {
                mSnakeView.setMode(SnakeView.PAUSE);
            }
        }
    }

   public void onSaveInstanceState(Bundle outState) {
        //Store the game state
        outState.putBundle(ICICLE_KEY, mSnakeView.saveState());  // 저장하는 부분.
    }

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

    public Bundle saveState() {
        Bundle map = new Bundle();

        map.putIntArray("mAppleList", coordArrayListToArray(mAppleList));
        map.putInt("mDirection", Integer.valueOf(mDirection));
        map.putInt("mNextDirection", Integer.valueOf(mNextDirection));
        map.putLong("mMoveDelay", Long.valueOf(mMoveDelay));
        map.putLong("mScore", Long.valueOf(mScore));
        map.putIntArray("mSnakeTrail", coordArrayListToArray(mSnakeTrail));

        return map;
    }

   public void restoreState(Bundle icicle) {
        setMode(PAUSE);

        mAppleList = coordArrayToArrayList(icicle.getIntArray("mAppleList"));
        mDirection = icicle.getInt("mDirection");
        mNextDirection = icicle.getInt("mNextDirection");
        mMoveDelay = icicle.getLong("mMoveDelay");
        mScore = icicle.getLong("mScore");
        mSnakeTrail = coordArrayToArrayList(icicle.getIntArray("mSnakeTrail"));
    }







by 수영사랑 | 2010/12/21 12:39 | 12/20~12/23 | 트랙백 | 덧글(1)

하나의 프로세스에서 여러 애플리케이션 실행하기



안드로이드펍에서 회색님이 올리신 글입니다. ( http://www.androidpub.com/10481 )


안드로이드는 백그라운드와 포어그라운드에서 여러 애플리케이션(Application)이 상호 연동해서 동작할 수 있게 구성되어있습니다. 문제는 어플리케이션 프로세스(Process)가 너무 자주 그리고 많이 생성되는 것은 메모리와 CPU측면에서 좋지 않습니다. 상호 연동되는 어플리케이션을 여러개 만들어서 동작시키는 것이 필요한 경우에 하나의 프로세스에서 동작하도록 지정할 수 있습니다. 이것게 처리하는 것은 매우 바람직합니다.

1. AndroidManifest.xml에 android:sharedUserId를 지정합니다. 안드로이드는 어플리케이션 마다 리눅스 User ID를 할당하는데 sharedUserId는 서로 다른 어플리케이션에서 같은 User ID를 공유할 수 있도록 합니다. 같은 User ID를 공유하면 서로 파일등의 데이터를 공유할 수 있고 프로세스도 공유할 수 있게 됩니다. 어플리케이션은 같은 Certificate로 서명되어야만 User ID를 공유할 수 있습니다.

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.androidpub.sample"
      android:sharedUserId="androidpub.user"
      android:versionCode="1"
      android:versionName="1.0">

2. 각 애플리케이션의 Application 태그에 android:process를 같은 값으로 지정합니다.


<application android:icon="@drawable/icon" android:label="@string/app_name"
            android:process="androidpub.process.share">


유의해야할 점은 Application Process를 공유함으로써 Application Context도 공유된다는 점입니다.
그리고 어플리케이션 업데이트시에 User ID가 바뀌는 경우 기존 데이터가 리셋되는것 같습니다. 이미 퍼블리쉬된 어플의 경우 치명적일수도 있으니 주의하셔야 합니다.

레퍼런스 : http://developer.android.com/guide/topics/manifest/manifest-intro.html



by 수영사랑 | 2010/12/21 10:17 | 12/20~12/23 | 트랙백 | 덧글(0)

apk 간의 File 공유 방법



File 이

1. MODE_WORLD_WRITEABLE 로 만들어 진 경우. createPackageContext() 를 이용하여 공유 할 수 있음.



2. MODE_PRIVATE 로 만들어 진 경우. sharedUserId 를 같게 하여 공유 할 수 있음. (AndroidManifest.xml 에서 추가함.)


----------------
        try {
         br= new BufferedWriter(new OutputStreamWriter(
           //c.openFileOutput("data.txt",MODE_WORLD_WRITEABLE)));           
           c.openFileOutput("data.txt",MODE_PRIVATE)));
            br.append("안녕하세요.\n");
            br.append("반갑습니다.99");
            t.setText("파일이 정상적으로 생성되었습니다.99");
         } catch (IOException e) {
            Log.e("IO", "File Output Error");
            t.setText("파일이 생성시 오류가 발생했습니다.");
        } finally{
         try{
          if(br!=null) br.close();
         }catch(IOException ioe){ioe.printStackTrace();}
        }
----------------
        try {
   Context c=createPackageContext("com.androidjava.file.out",
                       Context.CONTEXT_IGNORE_SECURITY);
         br= new BufferedReader(new InputStreamReader(
                             c.openFileInput("data.txt")));           
            String msg=br.readLine();
             while(msg !=null){
             t.append(msg+"\n");
             msg=br.readLine();
            }
        } catch (Exception e) {
            Log.e("IO", "File Input Error"+e);
        } finally{
         try{
          if(br!=null) br.close();
         }catch(IOException ioe){ioe.printStackTrace();}
        }
----------------





by 수영사랑 | 2010/12/21 10:14 | 12/20~12/23 | 트랙백(1) | 덧글(1)

◀ 이전 페이지다음 페이지 ▶