Android Basic

1.. Android Application ์ƒํƒœ ์œ ์ง€ ๊ธฐ๋ฒ•

์•„๋ž˜๋Š” Activity ์˜ life Cycle ์ด๋‹ค. Android ๋Š” Process ์˜ ๊ด€๋ฆฌ๋ฅผ Android Frame Work์ด ์ˆ˜ํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐœ๋ณ„Application ์—์„œ๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ ๋“ฑ์— ์˜ํ•œ ๊ธ‰์ž‘์Šค๋Ÿฌ์šด ์‹œ์Šคํ…œ์˜ ์ข…๋ฃŒ๋ฅผ ๋Œ€๋น„ํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค.

Activity ์˜ ์ƒ์„ฑ์„ ์œ„ํ•œ ์ž์›์˜ Loading ๋ฐ Setting ์„onCreate()์—์„œ App ์ด ์ข…๋ฃŒ์‹œ์— ํ•„์š”ํ•œprocess ์ฒ˜๋ฆฌ๋ฅผ onPause() ์—์„œ ํ•œ๋‹ค๋Š” ๊ฒƒ์€ ํ‹€๋ฆฐ ์ด์•ผ๊ธฐ๋Š” ์•„๋‹ˆ์ง€๋งŒ onCreate์™€ onPause ์— ์ฝ”๋“œ๊ฐ€ ์ง‘์ฃผ๋˜๋Š” ๊ฒƒ์„ ๋ง‰๊ณ  ํ™•์‹คํ•œ Application์˜ ์ƒํƒœ์œ ์ง€๋ฅผ ์œ„ํ•ด์„œ๋Š” ์•„๋ž˜์˜ ๋‘ ๊ฐ€์ง€ ์ƒํƒœ๋ฅผ ์ด์šฉํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค.

onsaveInstanceState : Activity๊ฐ€ ์ข…๋ฃŒ๋˜๋Š” ์‹œ์ ์— ๋ถˆ๋ ค์ง„๋‹ค. ์ˆœ์„œ๋กœ๋Š” onPause() ๋‹ค์Œ์— ์‹คํ–‰

onRestoreInstanceState : Activity ๊ฐ€ ๋‹ค์‹œ ํ™”๋ฉด์œผ๋กœ ์˜ฌ๋ผ์˜ค๋Š” ๊ฒฝ์šฐ ๋ถˆ๋ ค์ง„๋‹ค. onCreate ๋‹ค์Œ ์‹คํ–‰

์œ„์˜ ๋‘ ์ƒํƒœ์—์„œ๋Š” Instance ์˜ ์ €์žฅ์„ ์œ„ํ•ด Parcelable ์„ ์ƒ์†๋ฐ›๋Š” Bundle ๊ฐ์ฒด๋ฅผ ์ด์šฉํ•˜๋ฉฐ

์ด์— ๋Œ€ํ•œ ์„ค๋ช…์€ ๋’ค์ชฝ์—์„œ ํ•˜๋„๋ก ํ•œ๋‹ค.

  1. Fragment

Android 3.0 ์ดํ•˜์—์„œ๋Š” ํ™”๋ฉด์€ ์ฆ‰ Activity ์ด๊ณ  ๋ชจ๋“  logic ์ฒ˜๋ฆฌ๋ฅผ Activity ์•ˆ์—์„œ ์ˆ˜ํ–‰์„ ํ•˜์˜€๋‹ค๋ฉด Android 3.0 ์ด์ƒ์˜ ๋ฒ„์ „์—์„œ๋Š” Activity ์•ˆ์— ๋ณต์ˆ˜๊ฐœ์˜ ๋ณ„๋„์˜ ์ƒ๋ช… ์ฃผ๊ธฐ๋ฅผ ๊ฐ–๋Š”Fragment ๋ฅผ

ํฌํ•จํ•˜์—ฌ ๊ฐœ๋ฐœํ•˜๋„๋ก UI ๊ฐœ๋ฐœ ์‚ฌ์ƒ์ด ๋ฐ”๋€Œ์—ˆ๋‹ค. ๊ธฐ๋ณธ์ ์ธ ์‚ฌ์šฉ๋ฐฉ๋ฒ•์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

– Fragment๋ฅผ ์ƒ์†๋ฐ›๋Š” ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

– ์ƒ์„ฑํ•œ Fragment ๋ฅผ layout ํ˜น์€ java ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด Activity ์— ๋“ฑ๋กํ•œ๋‹ค.

(1) Activity ์— Fragment ๋“ฑ๋กํ•˜๊ธฐ

  1. A) Fragment Class ์ •์˜

Fragment ๋Š” Activity ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ผ๋ฐ˜ Fragment , ListFragment ๋“ฑ ๋‹ค์–‘ํ•œ ์ข…๋ฅ˜์˜ Fragment ๊ฐ€ ์กด์žฌํ•˜๋ฉฐ, ๊ธฐ๋ณธ์ ์ธ Fragment ์˜ ๊ฒฝ์šฐ ์•„๋ž˜์™€ ๊ฐ™์€ callback Class ๋“ค์„ ๊ฐ–๋Š”๋‹ค.

@Override

public void onAttach(Activity activity) {

super.onAttach(activity); }

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState); }

@Override

public void onSaveInstanceState(Bundle outState) {

super.onSaveInstanceState(outState);

}

@Override

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)

{

return tv;

}

@Override

public void onActivityCreated(Bundle savedInstanceState) {

super.onActivityCreated(savedInstanceState);

}

@Override

public void onStart() {

super.onStart();

}

@Override

public void onResume() {

super.onResume();

}

@Override

public void onPause() {

super.onPause();

}

@Override

public void onStop() {

super.onStop();

}

@Override

public void onDestroyView() {

super.onDestroyView();

}

@Override

public void onDestroy() {

super.onDestroy();

}

@Override

public void onDetach() {

super.onDetach();

}

  1. B) layout XML ์— ๋“ฑ๋กํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•

<fragment class=”edu.jaen.android.fragment.layout.FragmentLayout$TitlesFragment”

android:id=”@+id/titles”

android:layout_width=”match_parent”

android:layout_height=”match_parent” />

  1. B) Java ์—์„œ ๋™์ ์œผ๋กœ ํฌํ•จ์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•

DetailsFragment details = new DetailsFragment();

details.setArguments(getIntent().getExtras());

getFragmentManager().beginTransaction().add(android.R.id.content,

details).addToBackStack(null).commit();

@Sample@ : 1. Fragment ํด๋” ์ฐธ์กฐ

  1. Action Bar

API11 ๋ถ€ํ„ฐ ๊ธฐ์กด์˜ title bar์— ๋ฉ”๋‰ด, tab ๋“ฑ์˜ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜์—ฌ ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ์„ ํฌํ•จํ•œ Action Bar Class ๊ฐ€ ์ œ๊ณต๋œ๋‹ค .๊ธฐ๋ณธ์ ์ธ ์‚ฌ์šฉ๋ฐฉ๋ฒ•์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

– menu ํ˜•ํƒœ๋ฅผ layout ํ˜น์€ java ์ฝ”๋“œ๋กœ ์ƒ์„ฑ

– activity ์˜ onCreateOptionsMenu, onOptionsItemSelected ์—์„œ ์ƒ์„ฑํ•œ ๋ฉ”๋‰ด ํ˜น์€ TAB์„ Activity ์— ์ถ”๊ฐ€ํ•œ๋‹ค.

(1) action bar ์— ๋ฉ”๋‰ด ๋“ฑ๋ก

  1. A) xml ์— ๋ฉ”๋‰ด๋ฅผ ์ •์˜

Menu -> item -> menu(sub) -> item(sub)๊ณผ ๊ฐ™์€ ํ˜•์‹์œผ๋กœ xml ์— ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

<menu xmlns:android=“http://schemas.android.com/apk/res/android”

android:actionViewClass=“android.widget.HorizontalScrollView”>

<item android:id=“@+id/action_sort”

android:icon=“@android:drawable/ic_menu_sort_by_size”

android:title=“@string/action_bar_sort”

android:showAsAction=“always”>

<menu>

<item android:id=“@+id/action_sort_size”

android:icon=“@android:drawable/ic_menu_sort_by_size”

android:title=“@string/action_bar_sort_size”

android:onClick=“onSort”/>

<item android:id=“@+id/action_sort_alpha”

android:icon=“@android:drawable/ic_menu_sort_alphabetically”

android:title=“@string/action_bar_sort_alpha”

android:onClick=“onSort”/>

</menu>

</item>

</menu>

  1. b) java ์—์„œ ๋™์ ์œผ๋กœ ์ถ”๊ฐ€

menu.add(“Normal item1”);

menu.add(“Normal item2”);

menu.add(“Normal item3”);

MenuItem actionItem = menu.add(“Action Button”);

actionItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);

actionItem.setIcon(android.R.drawable.ic_menu_share);

 

(2) Activity ์—์„œ์˜ ์ฒ˜๋ฆฌ

  1. A) Menu Event ์ฒ˜๋ฆฌ

onCreateoptionMenu ์™€ onOptionsItemSelected Event API11 ์ด์ „ ๋ฒ„์ „๊ณผ ๋™์ผํ•˜์ง€๋งŒ

actionItem.setShowAsAction๋ฉ”์„œ๋“œ๋ฅผ ์‹คํ–‰ํ•จ์œผ๋กœ์จ ActionBar ๋กœ ๋ฉ”๋‰ด๋ฅผ ์˜ฌ๋ ค ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

@Override

public boolean onCreateOptionsMenu(Menu menu) {

// java์—์„œ ๋™์ ์œผ๋กœ ๋“ฑ๋ก

menu.add(“Normal item3”);

MenuItem actionItem = menu.add(“Action Button”);

actionItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);

actionItem.setIcon(android.R.drawable.ic_menu_share);

// xml layout inflating

MenuInflater inflater = getMenuInflater();

inflater.inflate(R.menu.actions, menu);

return true;

}

@Override

public booleanonOptionsItemSelected(MenuItem item) {

 

// ์„ ํƒ๋œ ๋ฉ”๋‰ด์— ๋Œ€ํ•œ ๊ธฐ๋Šฅ ์ฒ˜๋ฆฌ

return true;

}

 

  1. B) Tab ์ถ”๊ฐ€

ActionBar ์˜ addTab ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•˜์—ฌ ๋™์ ์œผ๋กœ tab์„ ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ Fragment์™€์˜ ์—ฐ๋™์„ ํ†ตํ•ด API 11 ์ด์ „ TabActivity ๊ธฐ๋Šฅ์„ ๋Œ€์ฒด ํ•  ์ˆ˜ ์žˆ๋‹ค.

final ActionBar bar = getActionBar();

final int tabCount = bar.getTabCount();

final String text = “Tab ” + tabCount;

bar.addTab(bar.newTab().setText(text).setTabListener(new TabListener(new TabContentFragment(text))));

@Sample@ : ActionBar ํด๋” ์ฐธ์กฐ

  1. Loader

์ฝ๋Š” ์ฆ‰์‹œ์ฆ‰์‹œ ์ถœ๋ ฅ๊ฐ€๋Šฅํ•˜๋„๋ก ๊ฐ„๋‹จํ•œ ๋ฉ”์„œ๋“œ๋“ค์„ ์ง€์›ํ•œ๋‹ค. Thread ์™€ ์œ ์‚ฌํ•œ ๊ฐœ๋…์œผ๋กœ ์•ˆ๋“œ๋กœ์ด๋“œ์—์„œ ์ง€์›ํ•˜๋Š” Loding์„ ์œ„ํ•œ ํด๋ž˜์Šค

(1) LoadManager ๋“ฑ์„ Implement

– implements OnQueryTextListener, LoaderManager.LoaderCallbacks

(2) init method ํ˜ธ์ถœ

– getLoaderManager().initLoader(id, Bundle arg, callback);

(3) call back method ์ •์˜

A)onCreateLoader

public Loader<Cursor> onCreateLoader(int id, Bundle args) {

Uri baseUri;

if (mCurFilter != null) {

baseUri = Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI,

Uri.encode(mCurFilter));

} else {

baseUri = Contacts.CONTENT_URI;

}

String select = “((” + Contacts.DISPLAY_NAME + ” NOTNULL) AND (”

+ Contacts.HAS_PHONE_NUMBER + “=1) AND (”

+ Contacts.DISPLAY_NAME + ” != ” ))”;

return newCursorLoader(getActivity(), baseUri,

CONTACTS_SUMMARY_PROJECTION, select, null,

Contacts.DISPLAY_NAME + ” COLLATE LOCALIZED ASC”);

}

B)onLoadFinished

public void onLoadFinished(Loader<Cursor> loader, Cursor data) {

 

mAdapter.swapCursor(data);

 

if (isResumed()) {

setListShown(true);

} else {

setListShownNoAnimation(true);

}

}

C)onLoadReset

public voidonLoaderReset(Loader<Cursor> loader) {

mAdapter.swapCursor(null);

}

@Sample@ : 8.LoaderCursor

  1. Intent

Intent ๋Š” Android Framework ๊ณผ ํ†ต์‹ ํ•˜๊ธฐ ์œ„ํ•œ ํ†ต์‹ ๊ฐ์ฒด๋กœ Android ์—์„œ Intent๋กœ ๋‹ค๋ฅธ Activity๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ณผ์ •์€ ์•„๋ž˜์™€ ๊ฐ™์ด ์ผ์–ด๋‚œ๋‹ค.

(Activity -> Intent ํ˜ธ์ถœ ->Android Frame Work -> Target Activity)

Android ๊ฐ€ Target Action์„ ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ช…์‹œ์  ํ˜ธ์ถœ๋ฐฉ๋ฒ•๊ณผ ์•”๋ฌต์  ํ˜ธ์ถœ๋ฐฉ์‹์ด ์žˆ๋‹ค.

๋ช…์‹œ์  ํ˜ธ์ถœ๋ฐฉ๋ฒ•์€ package ๋ช…์„ ์ง์ ‘ ์ง€์ •ํ•˜์—ฌ ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ์‹์ด๊ณ , ์•”๋ฌต์  ํ˜ธ์ถœ๋ฐฉ์‹์€ category, action, data ์˜ ์กฐ๊ฑด์„ ๊ฐ€์ง€๊ณ  broad casting ๋ฐฉ์‹์œผ๋กœ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

(1) ๋ช…์‹œ์  ํ˜ธ์ถœ๋ฐฉ์‹

ComponentName n=new ComponentName(“edu.diana.audio”,”edu.diana.audio.AudioAct”);

i.setComponent(n);

startActivity(i);-

(2) ์•”๋ฌต์  ํ˜ธ์ถœ๋ฐฉ์‹

i.addCategory(Intent.CATEGORY_DEFAULT);

i.setAction(Intent.ACTION_VIEW);

i.setData(Uri.parse(“poscocctvmobapp:”));

startActivity(i);

(3) Android-manifest ์„ค์ •

<intent-filter>

<action android:name=“android.intent.action.VIEW”/>

<category android:name=“android.intent.category.DEFAULT”/>

<category android:name=“android.intent.category.BROWSABLE”/>

<data android:scheme=“poscocctvmobapp” />

</intent-filter>

(4) Intent ํ˜ธ์ถœ์‹œ Flag ๋ฅผ ํ†ตํ•œ TASK ๊ด€๋ฆฌ

Task ๋Š” android process ๋“ค์˜ ์‹คํ–‰ ์ˆœ์„œ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค. ์‰ฌ์šด ์˜ˆ๋กœ H/W back ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅผ ๊ฒฝ์šฐ ์ด์ „์— ์‚ฌ์šฉํ–ˆ๋˜ App ๋“ค์„ ํ™”๋ฉด์ƒ๋‹จ์œผ๋กœ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ํ˜„์ƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

์ด๋Ÿฌํ•œ task ๋Š” Android ActivityManager ์—์„œ ์ˆ˜ํ–‰ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, Task ๋Š” Intent ํ˜ธ์ถœ ์‹œ Flag ๊ฐ’๊ณผ

Android-Manifest ์—์„œLuchMode ๋ฅผ ์ •์˜ํ•จ์œผ๋กœ์จ ์ปจํŠธ๋กค ํ•  ์ˆ˜ ์žˆ๋‹ค .

  1. A) flag

flag ๋ฅผ ํ†ตํ•ด์„œ task ๊ด€๋ฆฌ ๊ฐ€๋Šฅ, bit์—ฐ์‚ฐ์œผ๋กœ ๋ณต์ˆ˜์˜ flag ์„ธํŒ… ๊ฐ€๋Šฅ

-intent.FLAG_ACTIVITY_RECORDER_TO_FRONT : ๊ฐ™์€ ๋†ˆ์€ ์œ„๋กœ ์˜ฌ๋ฆฐ๋‹ค.

-intent.FLAG_ACTIVITY_CLEART_TOP : ํ˜ธ์ถœ ๋Œ€์ƒ ์œ„์— ์žˆ๋Š” task ์‚ญ์ œ (ํ˜ธ์ถœ ๋Œ€์ƒ๊นŒ์ง€ ์‚ญ์ œํ•˜๊ณ 

๋Œ€์ƒ์„ ๋‹ค์‹œ ๋งŒ๋“ ๋‹ค)

– intent.FLAG_ACTIVITY_CLEART_TOP|intent.FLAG_ACTIVBITY_SINGLE_TOP : (ํ˜ธ์ถœ ๋Œ€์ƒ์„ ์‚ญ์ œํ•˜์ง€

์•Š๊ณ  ์œ„๋ฅผ ์ „์ฒด ์‚ญ์ œ)

-intent.FLAG_ACTIVITY_NEW_TASK : ์ƒˆ๋กœ์šด ํ…Œ์Šคํฌ ์ƒ์„ฑ, service ๋ฐbroadcast_receiver ์—์„œ

Activity๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉ

  1. B) LunchMode ย  ย  ย 

-standard : ๋™์ผํ•œ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ค‘๋ณตํ•˜์—ฌ ์Œ“์ผ์ˆ˜ ์žˆ๋‹ค.

– singleTop : ๋™์ผํ•œ ํ”„๋กœ์„ธ์Šค๋ฅผ ์—ฐ์†์œผ๋กœ ๋‘๋ฒˆ ๋ˆ„๋ฅด๋Š” ๊ฒฝ์šฐ ๋™์ผํ•œ ๊ฒƒ์€ ์Šคํƒ์— ์Œ“์ง€ ์•Š์Œ

– singleTask : ํ˜ธ์ถœ๋œ Activity ๋ฅผ ์‹œ์ž‘์ ์œผ๋กœ ์ƒˆ๋กœ์šด task์ƒ์„ฑ

– singleinstance : ๋…๋ฆฝ์ ์œผ๋กœ ํ•˜๋‚˜์˜ activity ๋งŒ ์กด์žฌํ•จ (ex : ๋Ÿฐ์ณ)

Cf) lunchMode – task๋ช… : ํ…Œ์Šคํฌ ๋ช…์„ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด(Activity-Task afifinity) ๊ธฐ๋ณธ์ ์œผ๋กœ Package ๋ช…์„ ๋”ฐ๋ผ๊ฐ„๋‹ค. task ๋ช…์ด ๊ฐ™์€ ๊ฒฝ์šฐ

  1. ์ž์›๊ณต์œ 

(1) ํŒŒ์ผ ์ž์ฒด๋ฅผ ๊ณต์œ ํ•˜๋Š” ๋ฐฉ๋ฒ•

– ๊ธฐ๋ณธ์ ์œผ๋กœ DB, FILE ๋“ฑ์€ Linux ๊ถŒํ•œ ์ •์ฑ…์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ฝ์„ ์ˆ˜ ์—†๋‹ค . ย  ย 

– ๊ธฐ๋ณธ์ ์œผ๋กœ Cache, File, DB ๋Š” ์ž์‹ ์˜ Context ์˜์—ญ์— ์ •์˜๋œ๋‹ค.

– ๋‹ค๋ฅธ Context ์˜ ์ž๋ฃŒ๋ฅผ ๊ฐ€์ง€๊ณ  ์‹ถ๋‹ค๋ฉด. createPackageContext๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋‹ค๋ฅธ ์ปจํƒ์ŠคํŠธ๋ฅผ

์ƒ์„ฑํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค (๋‹จ, ๊ถŒํ•œ์€ ์žˆ์–ด์•ผ ํ•œ๋‹ค. )

– ๋‹จ, ํŒŒ์ผ๋งŒ๋“ค๊ธฐ ๋‹จ๊ณ„์—์„œ(createPackageContext) ๊ถŒํ•œ์„ ์ฃผ๋ฉด ๋‹ค๋ฅธ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ง์ ‘

Access ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

– ํŠน์ •ํ•œ ํ”„๋กœ์ œํŠธ๋ฅผ ์ง€์ •ํ•˜์—ฌ ์„œ๋กœ ์ ‘๊ทผ๊ฐ€๋Šฅํ•˜๋„๋ก ํ•˜๊ณ  ์‹ถ๋‹ค…-> userID ๋ฅผ ๊ณต์œ ํ•ด์•ผ ํ•œ๋‹ค.

android.os.Process.myUid(), Android_manifiest : shared user id ๋ฅผ ๊ณต์œ ํ•˜๋„๋ก ํ•˜๋ฉด ๋จ.

(2) jar ๋ฅผ ํ†ตํ•œ ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ณต์œ 

– ์•ˆ๋“œ๋กœ์ด๋“œ๋Š” ํ”„๋ ˆ์ž„์›์ด๊ธฐ ๋•Œ๋ฌธ์— ์ •ํ•ด์ง„ ํด๋”๋งŒ ๋นŒ๋“œ์‹œ์— ๋ฌถ๋Š”๋‹ค.

– ํ™•์ธ ๋ฐฉ๋ฒ•์€ ํด๋”์— A ๋ชจ์–‘์ด ์žˆ๋Š”์ง€๋ฅผ ํ™•์ธํ•œ๋‹ค.

– ๋ณดํ†ต์˜ ๊ฒฝ์šฐ libs ์•„๋ž˜ jar ํŒŒ์ผ์„ ํฌํ•จ์‹œํ‚ค๊ณ  path ๋ฅผ ๊ฑธ์–ด์ค€๋‹ค.

(3) apk ํŒŒ์ผ ๊ณต์œ 

– ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ธํŒ… : ํ”„๋กœ์ ํŠธ ์„ ํƒ – propoerties – android – isLib ์ฒดํฌ

– ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ : ํ”„๋กœ์ ํŠธ ์„ ํƒ – propoerties – android – add

(4) DB ๊ณต์œ  – Content-Provider ์‚ฌ์šฉ

DB์ž์ฒด๋ฅผ ๊ณต์œ ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ contentProvider๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋‹ค.

Android์—์„œ ์ œ๊ณตํ•˜๋Š” ์ฃผ์†Œ๋ก๊ณผ ๊ฐ™์€ ๊ฒƒ๋“ค์ด ์ด๋Ÿฌํ•œ ํ˜•ํƒœ๋กœ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ณตํ•˜๊ณ 

์žˆ๋‹ค. Content Provider ๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ๊ตฌ์กฐ๋กœ ๋™์ž‘ํ•œ๋‹ค.

Activity ( contentResolver์‚ฌ์šฉ)

->URI(target์ง€์ •) ,update(),delete(),query(),insert() ๋ฉ”์„œ๋“œ ์‚ฌ์šฉ

-> ContentProvider ๋Š” ํ•ด๋‹น ๋ฉ”์„œ๋“œ์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ

.

– Content-Provider์˜ ์ด๋ฆ„์€ ๊ณ ์œ ํ•ด์•ผ ํ•œ๋‹ค.

-SQLLiteOpenHelper์˜ ๊ฒฝ์šฐ Android Frame work ์—์„œ ๊ด€๋ฆฌํ•˜์ง€ ์•Š๋Š” ํด๋ž˜์Šค์ด๋‹ค.

– ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์—content-provider ๋ฅผ ์ƒ์†๋ฐ›์•„ ๊ตฌํ˜„์„ ํ•˜๋ฉด Frame ์„ ํ†ตํ•ด ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

-content-provider ์˜ ๋ฏธ๊ตฌํ˜„ ๋ฉ”์„œ๋“œ๋Š” insert, update, delete-query

-content-provider๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์œ„ํ•œ ํด๋ž˜์Šค๋Š” contentResolver ์ด๋‹ค.

-> context.getContentResolver ๋ฅผ ํ†ตํ•ด์„œ ๊ตฌํ•œ๋‹ค.

-> insert(URI, ), update(URI, ), delete, quert ๋ฉ”์„œ๋“œ ์ง€์›…

  1. android ์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ณตํ•˜๋Š” URI ๋Š” android.provider ์—์„œ ์ฐพ๋Š”๋‹ค.

– ํƒ€๊ฒŸ Content-Provider ๋Š” Android-Manifest ๋“ฑ๋ก ์‹œ authority ๋ฅผ ๋“ฑ๋กํ•ด์•ผ ํ•œ๋‹ค.

-> URI : content://<์ •์˜ํ•œauthority>/path(table๋ช…)

<provider android:name=“MyContentProvider” android:authorities=“com.ict”

android:exported=“true”></provider>

-Content-Provider ์ƒ์„ฑํ›„ manifiest ์˜ export ์†์„ฑ์„ true ๋กœ ์ •์˜ํ•ด ์ฃผ์–ด์•ผ ํ•œ๋‹ค.

-Provider ๋Š” ๊ฐ Method ์—์„œ path ๋ช…์„ ์ด์šฉํ•˜์—ฌ ์„œ๋น„์Šค๋ฅผ ๋ถ„๊ธฐ์ฒ˜๋ฆฌ ํ•  ์ˆ˜ ์žˆ๋‹ค.

@SAMPLE@ : Content-Provider ํด๋” ์ฐธ์กฐ

  1. Broadcast Receiver

BroadcastReceiver๋Š” ๋ฒ ํ„ฐ๋ฆฌ ์ƒํƒœ, ์ถฉ์ „, wifi์ ‘์†, ๋ฌธ์ž ๋“ฑ ๊ฐ์ข… Broadcast Event ์— ๋Œ€์‘ํ•˜๊ธฐ

์œ„ํ•˜์—ฌ ์‚ฌ์šฉํ•œ๋‹ค. Broadcast Receiver๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

  1. ย  A) Receiver ์ƒ์„ฑ

– Receiver ์ธก์˜ Android-Manifest ์— ๋“ฑ๋กํ•˜๊ฑฐ๋‚˜ Java ์ƒ์—์„œ ๋“ฑ๋กํ•œ๋‹ค.

– BroadcastReceiver ๋ฅผ ์ƒ์†๋ฐ›์•„ onReceive(Context context, Intent intent)

๋ฉ”์„œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉ ํ•œ๋‹ค.

  1. ย  B) Broadcast ํ˜ธ์ถœ

– Android-Manifest ์— Braodcast Messgage ์ „์†ก ํผ๋ฏธ์…˜์„ ์ถ”๊ฐ€ํ•œ๋‹ค .

<uses-permission android:name=“android.permission.BROADCAST_STICKY”>

– context method ์ธ sendOrderedBroadcast,sendStickyBroadcast๋“ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ„๋‹จํžˆ

ํ˜ธ์ถœ ๊ฐ€๋Šฅํ•˜๋‹ค.

(1) Broadcast Receiver์ƒ์„ฑ ๋ฐฉ๋ฒ•

  1. A) android-manifest.xml ์— ๋“ฑ๋ก

์•„๋ž˜์™€ ๊ฐ™์ดAndroid-Manifest์— ๋“ฑ๋กํ•˜๋Š” ๊ฒฝ์šฐ Android Framework์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋ชจ๋“ 

๋ฉ”์‹œ์ง€์— ๋Œ€ํ•ด์„œ ๋ฐ˜์‘ํ•œ๋‹ค.

<receiver

android:name=“edu.jaen.android.receiver.OneShotAlarm1”

android:process=“:remote”>

<intent-filter android:priority=“1”>

<action android:name=“com.jaen.REGISTER” />

</intent-filter>

</receiver>

  1. B) Activity ์—์„œ Regist

Java ์—์„œ ๋‚ด๋ถ€์ ์œผ๋กœ ๋“ฑ๋กํ•˜๋Š” ๊ฒฝ์šฐ Android Framework์ด ์•Œ๊ณ  ์žˆ์ง€ ๋ชปํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์•„๋ž˜์™€

๊ฐ™์ด BraodcastReceiver ๋ฅผ ๋“ฑ๋กํ•˜๊ธฐ ์ „์—๋Š” ๋™์ž‘ํ•˜์ง€ ์•Š๋Š”๋‹ค. (๋กœ์ปฌํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์„ ๊ฒฝ์šฐ)

Context c=getApplicationContext();

IntentFilter f=new IntentFilter(“com.jaen.REGISTER”); //action

f.setPriority(500); // ์šฐ์„ ์ˆœ์œ„ ๋ถ€์—ฌ

c.registerReceiver(a2, f); //receiver ๋“ฑ๋ก

  1. C) BroadCastting ์š”์ฒญ ๋ฐฉ๋ฒ•

์‚ฌ์šฉ์ž๊ฐ€ Braodcast ๋ฉ”์‹œ์ง€๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒฝ์šฐ ํฌ๊ฒŒ 3๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ ํ˜ธ์ถœ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

– sendBroadCast() : ๋™์ผํ•œ action ์„ ๊ฐ–๊ณ  ์žˆ๋Š” Broadcast ๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ ์žˆ์„ ๊ฒฝ์šฐ Random

– sendOrderedBroadcast(): ์—ฌ๋Ÿฌ ๊ฐœ๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ ์šฐ์„ ์ˆœ์œ„์— ์˜ํ•ด ์ˆœ์ฐจ์ ์œผ๋กœ ์‹คํ–‰

– sendStickyBroadcast() : ํ˜ธ์ถœ ์‹œ์ ์— Receiver๊ฐ€ ์—†์–ด๋„ ์‹ ๊ทœ ๋“ฑ๋ก์„ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ๋‹ค๊ฐ€ ์‹คํ–‰

  1. D) Intent Flag ๋ฅผ ์ด์šฉํ•œ Broadcast ์ œ์–ด

intent ์—์„œ ํ˜ธ์ถœ ์‹œ flag ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ œ์–ด๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค.

-FLAG_RECEIVER_REGISTED_ONLY : Android_Manifiest ์— ์ •์˜๋˜์–ด ์žˆ๋Š” receiver๋Š” ๋ฌด์‹œํ•œ๋‹ค.

-FLAG_RECEIVER_REPLACE_PENDING : ๋™์ผํ•œ intent ๊ฐ€ ์—ฐ์†์ ์œผ๋กœ ์ „๋‹ฌ๋  ๊ฒฝ์šฐ ์ฒ˜์Œ๊ณผ

๋งˆ์ง€๋ง‰ ๊ฒƒ๋งŒ ์ธ์‹ํ•จ

-FLAG_INCLUDE_STOPPED_PACKAGE : (Package๊ฐ€ Stopped)์ •์ง€๋˜์–ด ์žˆ๋Š” PROCESS ๋Š”

์‹คํ–‰๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค. ์ด๋Ÿฐ ๊ฒฝ์šฐ ์‚ฌ์šฉํ•œ๋‹ค.

 

@SAMPLE@ : BroadCastReceiver ํด๋” ์ฐธ์กฐ

  1. Widget – Service

Widget์€ ๊ธฐ๋ณธ์ ์œผ๋กœ HomeApplication ๊ณผ์˜ ํ†ต์‹ ์„ ํ†ตํ•ด์„œ ๋™์ž‘ํ•œ๋‹ค. Android ์—์„œ๋Š” ์ด๋Ÿฌํ•œ ๋ณต์žกํ•œ ํ†ต์‹  ๊ณผ์ •์„ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋กappWidgetProvider ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.,

์•„๋ž˜๋Š” ๊ธฐ๋ณธ์ ์ธ Widget ์˜ ๋™์ž‘ ๊ณผ์ •์ด๋‹ค.

Service -> RemoteView -> AppWidgetProvider-> Home Program

(1) Android-Manuifest.xml ์ •์˜

์•„๋ž˜์™€ ๊ฐ™์€ Manifest ์— ์ •์˜๋ฅผ ํ•˜๊ฒŒ ๋˜๋ฉด Android Home ์—์„œ Widget ์„ค์น˜ ๋ฉ”๋‰ด์— ๋“ฑ๋ก์ด ๋จ

Meta-data ์— ๋ณด๋ฉด Home์—์„œ Widget ์˜ UI ๋ฅผ ์ •์˜ํ•˜๋Š” xml ์ด ์ •์˜ ๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

<receiver

android:enabled=“true”

android:label=์Šค๋งˆ์ผ! ์ด๋ฒคํŠธ

android:name=“edu.jaen.android.wiget.event.WidgetReceiver”>

<intent-filter >

<action android:name=“android.appwidget.action.APPWIDGET_UPDATE”/>

</intent-filter>

<meta-data

android:name=“android.appwidget.provider”

android:resource=“@xml/smileinfo”/>

</receiver>

(2) [resource].xml ์ •์˜

Widget ์˜ ํฌ๊ธฐResizable ์—ฌ๋ถ€๋ฅผ ์ •์˜ํ•˜๊ณ  Widget์—์„œ ์‚ฌ์šฉํ• layout ๋“ฑ์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

<?xml version=“1.0”encoding=“utf-8”?>

<appwidget-provider xmlns:android=“http://schemas.android.com/apk/res/android”

android:minWidth=“40dip”

android:minHeight=“110dip”

android:resizeMode=“vertical|horizontal”

android:updatePeriodMillis=“0”

android:initialLayout=“@layout/smile”>

</appwidget-provider>

(3) layout ์ •์˜

Layout ์€ ๊ธฐ์กด์—Activity ๋‚˜ Fragment ์˜ Layout ์„ ์ •์˜ํ•˜๋Š” ๊ฒƒ๊ณผ ํฌ๊ฒŒ ๋‹ค๋ฅด์ง€ ์•Š๋‹ค.

<?xml version=“1.0”encoding=“utf-8”?>

<RelativeLayout xmlns:android=“http://schemas.android.com/apk/res/android”

android:id=“@+id/mainlayout”

android:layout_width=“wrap_content”

android:layout_height=“fill_parent”

android:orientation=“vertical”>

<ImageView

android:id=“@+id/smileImage”

android:layout_width=“wrap_content”

android:layout_height=“wrap_content”

android:src=“@drawable/smile”/>

<TextView

android:id=“@+id/smileText”

android:layout_width=“fill_parent”

android:layout_height=“wrap_content”

android:layout_alignRight=“@+id/smileImage”

android:layout_below=“@id/smileImage”

android:gravity=“center”

ย  ย  ย  android:text=“Smile”

android:textColor=“#ffff00”

android:textSize=“15sp”/>

</RelativeLayout>

(4)AppWidgetProvider ์ƒ์† ํด๋ž˜์Šค์ƒ์„ฑ

3๋ฒˆ ๊นŒ์ง€์˜ ๊ณผ์ •์„ ํ†ตํ•ด์„œ Widget์„ Home ํ™”๋ฉด์— ์ถœ๋ ฅํ•˜์˜€๋‹ค๋ฉด ์ด์ œ ์œ ๋™์ ์œผ๋กœ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ๋‚˜ ๋ฐ์ดํ„ฐ ๊ฐฑ์‹ ์„ ์œ„ํ•˜์—ฌ AppWidgetProvider ์™€ Service ๋ฅผ ์ด์šฉํ•˜์—ฌ์•ผ ํ•œ๋‹ค.

AppWidgetProvider ๋Š”Home ๊ณผ Service ์‚ฌ์ด์˜ ํ†ต์‹ ์„ ๋„์™€์ฃผ๋ฉฐ ํ†ต์‹ ์„ ์œ„ํ•ด์„œ๋Š” RemoteView๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๊ตํ™˜ํ•œ๋‹ค.

public class WidgetReceiver extends AppWidgetProvider {

public void onUpdate(Context context, AppWidgetManager appWidgetManager,

int[] appWidgetIds)

{

}

static void appWidgetUpdate(Context context, int appWidgetId, int imgId,

CharSequence text) {

}

@Override

public void onEnabled(Context context) {

super.onEnabled(context);

}

@Override

public void onDisabled(Context context) {

super.onDisabled(context);

}

@Override

public void onDeleted(Context context, int[] appWidgetIds) {

super.onDeleted(context, appWidgetIds);

}

}

(5)RemoteView ์ƒ์„ฑ

  1. A) RemoteView๋ฅผ ์ƒ์„ฑ

RemoteViews views = new RemoteViews(context.getPackageName(),R.layout.smile);

views.setImageViewResource(R.id.smileImage, imgId);

views.setTextViewText(R.id.smileText, text);

  1. B) AppWidgetManger ์ƒ์„ฑ

AppWidgetManager wm = AppWidgetManager.getInstance(context);

C)Service๋ฅผ ์‹คํ–‰ํ•  Intent ์ƒ์„ฑ

Intent intentImage = new Intent(context, ImageService.class);

intentImage.putExtra(“wId”, appWidgetId);

D)๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋žจ์ดIntent๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก PendinIntent ์ƒ์„ฑ

PendingIntent pendingImage = PendingIntent.getService(context,appWidgetId, intentImage, 0);

E)RemoteView ์— onClickPendingIntent Listener ๋ฅผ ์ถ”๊ฐ€

views.setOnClickPendingIntent(R.id.smileImage, pendingImage);

F)AppWidgetManager์˜ updateAppWidget() ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด HOST๋กœ View Update

wm.updateAppWidget(appWidgetId, views);

@Sample@ : 6. AppWigetEvent ํด๋”๋ฅผ ์ฐธ์กฐํ•œ๋‹ค.

  1. ์ƒํƒœ์œ ์ง€ ๊ธฐ๋ฒ•๊ณผ Parcelable

์ƒํƒœ ์œ ์ง€ ๊ธฐ๋ฒ•์œผ๋กœ๋Š” Preference ,Data Base, File , network ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ Android ์˜ System Memory ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ๋ฒ•์ด ์žˆ๋‹ค.

๋˜, Activity ์—์„œ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด onSaveInstanceState, onRestoreInstanceState ์ƒํƒœ๋ฅผ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์—ฌ๊ธฐ์„œ๋Š” Android์˜System Memory๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต๊ตฌํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ ์ด์•ผ๊ธฐ ํ•˜๊ณ ์ž ํ•œ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ Activity์™€ Android FrameWork์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ํ†ต์‹ ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— Seralized ๋œ ๊ฐ์ฒด๋งŒ์ด ์ „์†ก๊ฐ€๋Šฅํ•˜๋ฉฐ ํŠน๋ณ„ํžˆ Android ์—์„œ๋Š” Parcelable ์ด๋ผ๋Š” ๊ฐœ๋…์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค.

(1) Parcelable ์ด๋ž€?

– ๊ธฐ๋ณธ์ ์œผ๋กœ ์•ˆ๋“œ๋กœ์ด๋“œ๋Š” Activity ๊ฐ„์— Intent ํ†ต์‹ ์„ ์‚ฌ์šฉํ•œ๋‹ค.

– ํ†ต์‹ ์—์„œ ๊ฐ์ฒด๋ฅผ ์ „์†กํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” Serialized ๊ฐ€ ๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค.

– Serialized์˜ ๋‹จ์ ์€ ์†๋„๊ฐ€ ๋А๋ฆฌ๋‹ค๋Š” ๊ฒƒ์ธ๋ฐ ์ด๊ฒƒ์˜ ๋‹จ์ ์„ ๋ณด์™„ํ•œ ๊ฒƒ์ด Parcelable ์ด๋‹ค.

-Android ์—์„œ๋Š” ์ด๋Ÿฌํ•œ Parcelabel ์˜ ๊ฐœ๋…์„ ์‚ฌ์šฉํ•˜์—ฌ Bundle ์ด๋ผ๋Š” ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค

(2) onCreate, onSaveInstance ์—์„œ์˜ Bundle ํƒ€์ž… ํŒŒ๋ผ๋ฉ”ํ„ฐ

  1. A) save call back ์—์„œ Bundle ์— Parcelable ๊ฐ์ฒด๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.

ย  ์ €์žฅ๋œ ๊ฐ์ฒด๋Š” Android FrameWork ์˜ System Memory ๊ณต๊ฐ„์— ์ €์žฅ๋œ๋‹ค.

@Override

protected void onSaveInstanceState(Bundle outState) {

// TODO Auto-generated method stub

super.onSaveInstanceState(outState);

bundle.putParcelableArrayList(“list”, pList);

}.

  1. B) Bundle ๊ฐ์ฒด์—์„œ Parcelable ๊ฐ์ฒด๋ฅผ ๊บผ๋‚ด์–ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต๊ตฌํ•œ๋‹ค.

ย  ์ €์žฅ๋œ ๊ฐ์ฒด๋Š” Android FrameWork ์˜ System Memory ๊ณต๊ฐ„์— ์ €์žฅ๋œ๋‹ค.

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

pList = bundle.getParcelableArrayList(“list”);

}

(2) ๊ธฐ์กด์— Android ์— ์ •์˜๋œ Pacelable ๊ฐ์ฒด๋ฅผ ์ด์šฉ

– Bundle ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ Parcelable ๊ฐ์ฒด์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋ƒฅ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹คโ€ฆ

ArrayList<HashMap<String, String>> selectedChildList = null;

ArrayList<Bundle> currentList = null;

Bundle bundle = null;

HashMap<String, String> item = null;

Object[] keyArray = null;

if(mChildList != null && mChildList.size() > 0)

{

selectedChildList = mChildList.get(groupPosition); if(selectedChildList != null && selectedChildList.size() > 0)

{

currentList = new ArrayList<Bundle>();

for(int i = 0; i < selectedChildList.size(); i++) {

item = selectedChildList.get(i);

bundle = new Bundle();

keyArray = (Object [])item.keySet().toArray();

for(int j = 0; j < keyArray.length; j++)

{

bundle.putString(String.valueOf(keyArray[j]), item.get(keyArray[j]));

}

currentList.add(bundle);

}

}

(3) Parcelable ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์‚ฌ์šฉํ•˜๊ธฐ

– ๊ธฐ๋ณธ์ ์œผ๋กœ Parcelable ์„ Implements ๋ฐ›์•„ ์ƒ์„ฑํ•˜๋ฉฐ ๋ช‡ ๊ฐ€์ง€ ํ•„์ˆ˜์ ์ธ Method ๋ฅผ Overide ํ•˜์—ฌ ๊ตฌํ˜„ํ•˜์—ฌ์•ผ ํ•œ๋‹ค.

– writeToParcel: ํ†ต์‹ ์‹œ Android FrameWork์—์„œ ํ˜ธ์ถœ๋˜๋Š” ๋ฉ”์„œ๋“œ๋กœ Seraliazable ํ•˜๋„๋ก ์ง์ ‘ ์‚ฌ์šฉ์ž๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ set ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค. (์ด๋•Œ ์ˆœ์„œ๊ฐ€ ๋งค์šฐ ์ค‘์š”, CREATE ์™€ ์ผ์น˜ํ•ด์•ผ ํ•จ)

– CREATEOR : ๋ฆฌํ„ดํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฐ์ฒด ํƒ€์ž…์œผ๋กœ ๋ณต์›ํ•˜๋Š” ๋ฉ”์„œ๋“œ ๋˜ํ•œ Overide ํ•˜์—ฌ ๊ตฌํ˜„ ํ•„์š”

public class Point implements Parcelable{

float x;

float y;

boolean isDraw;

public Point(float f, float g, boolean isDraw) {

this.x = f;

this.y = g;

this.isDraw = isDraw;

}

@Override

public int describeContents() {

// TODO Auto-generated method stub

return 0;

}

@Override

public void writeToParcel(Parcel dest, int flags) {

// TODO Auto-generated method stub

dest.writeFloat(x);

dest.writeFloat(y);

dest.writeBooleanArray(new boolean[]{isDraw});

}

public static Creator<Point> CREATOR = newCreator<Point>() {

@Override

public Point createFromParcel(Parcel source) {

// TODO Auto-generated method stub

float x = source.readFloat();

float y = source.readFloat();

boolean[] ba = new boolean[1];

source.readBooleanArray(ba);

return new Point(x,y,ba[0]);

}

@Override

public Point[] newArray(int size) {

// TODO Auto-generated method stub

return new Point[size];

}

};

}

@Sample@ : CustomView ํด๋” ์ฐธ์กฐ

  1. binding ๊ณผ Service ๋ฅผ Custom Provider

– ์ด๋ฏธ ServiceBind ๊ธฐ๋Šฅ์„ ์ด์šฉํ•˜์—ฌ Service ์™€ Activity ๊ฐ„์˜ Interactive ํ•œ ํ†ต์‹ ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

์ƒ˜ํ”Œ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ๊ตฌ์กฐ๋กœ ๋™์ž‘ํ•œ๋‹ค. .

Activity -> Resolver-> (Bind) -> Service (onCreate() -> onBind()-> onUnBind()) ->onDestory());

Service ์ชฝ์—์„œ Bind() ๊ฐ€ ๋˜๋ฉด Resolver ์ธก์—๋Š” onServiceConnected() Callback ์ด ํ˜ธ์ถœ๋˜๋ฉฐ Bind

๋ณ€์ˆ˜๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค. ์ด Bind ๋ณ€์ˆ˜๋ฅผ Interface๋กœ Castinfํ•˜์—ฌ Service ์ธก๊ณผ ๋ฉ”์„œ๋“œ ๊ธฐ๋ฐ˜์˜ ํ†ต์‹ ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ์ด๋•Œ, ์ฃผ๊ณ  ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ๊ฐ์ฒด๋Š” ๋‹น์—ฐํžˆ ํ†ต์‹  ๊ธฐ๋ฐ˜์ด๊ธฐ ๋•Œ๋ฌธ์— Parcelable ๊ฐ์ฒด๋งŒ ๊ฐ€๋Šฅ

(1) Activity ->Resolver

์ƒ˜ํ”Œ์ฝ”๋“œ ์—์„œ Activity ์— ๊ตฌํ˜„๋˜๋Š” ๋‚ด์šฉ์€ ๋ณ„ ๊ฒƒ ์—†๋‹ค. Resolver ์— ๊ตฌํ˜„๋œ ๋ช‡ ๊ฐ€์ง€ ๋ฉ”์„œ๋“œ๋“ค์„ ํ˜ธ์ถœํ•  ๋ฟ์ด๋‹ค .

myResolver = new MyResolver(this);

Button btn01 = (Button)this.findViewById(R.id.btn_01);

btn01.setOnClickListener(newOnClickListener() {

@Override

public void onClick(View v) {

myResolver.insert();

}

});

(1) Resolver ->Service

์ƒ˜ํ”Œ์ฝ”๋“œ์—์„œ Resolver ๋Š” ์–ด๋–ค ์ธํ„ฐํŽ˜์ด์Šค๋„ ํด๋ž˜์Šค๋„ ์ƒ์† ๋ฐ›์ง€ ์•Š๋Š”๋‹ค. Resolver์—์„œ ํ•˜๋Š” ์—ญํ• ์€ 3๊ฐ€์ง€๋กœ ์š”์•ฝ๋œ๋‹ค. Service Binding, ServiceConnection ๊ฐ์ฒด๋ฅผ ํ†ตํ•œBinding ๊ฐ์ฒด ์ƒ์„ฑ, Binding ๊ฐ์ฒด๋ฅผ ์ด์šฉํ•œService method ํ˜ธ์ถœ 3๊ฐ€์ง€๋กœ ์š”์•ฝ๋œ๋‹ค.

  1. A) Service ๋ฐ”์ธ๋”ฉ

Intent i = new Intent();

ComponentName cn = new ComponentName(“com.example.a10.bindtestmyservice”,”com.example.a10.bindtestmyservice.MainService”);

i.setComponent(cn);

//๋ฐ”์ธ๋”ฉ

context.bindService(i, conn, Context.BIND_AUTO_CREATE);

  1. B) AIDL ์ƒ์„ฑ

๋‹ค๋ฅธ ํŒจํ‚ค์ง€ ๊ฐ„์— Method ๋ฐฉ์‹์œผ๋กœ Direct ํ˜ธ์ถœ์€ ๊ต‰์žฅํžˆ ๋ณต์žกํ•œ ์ผ์ด๋‹ค. ๊ทธ๋ž˜์„œ Android Frame Work ์—์„œ๋Š” AIDL ์„ ์ง€์›ํ•œ๋‹ค .

– AIDL ํ™•์žฅ์ž์˜ ํŒŒ์ผ์„src/package ์•„๋ž˜ ์ƒ์„ฑํ•œ๋‹ค.

– gen ํด๋” ์•„๋ž˜ java ํŒŒ์ผ์ด ์ž๋™ ์ƒ์„ฑ๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค .

– Service ๋ฅผ ์ œ๊ณต๋ฐ›๊ณ ์ž ํ•˜๋Š” ์ชฝ์—์„œ๋„ ๋™์ผํ•˜๊ฒŒ AIDL ํŒŒ์ผ์„ ์ƒ์„ฑํ•ด์•ผ ํ•œ๋‹ค.

– ๋‹จ, Service ๋ฅผ ์ œ๊ณตํ•˜๋Š” ์ชฝ๊ณผ ๋™์ผํ•œ Package ๋ช…์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ ์€ ์œ ์˜

– ์•„๋ž˜๋Š” AIDL ํŒŒ์ผ์˜ ์˜ˆ์ œ์ด๋‹ค.

package com.example.a10.bindtestmyservice;

interface AidlProvider

{

void insert();

void update();

void delete();

void query();

}

  1. C) ServiceConnection์ƒ์„ฑ

ServiceConnection ํด๋ž˜์Šค๋Š” ๋‘ ๊ฐœ์˜ Overiding method ๋ฅผ ์ง€์›ํ•˜๋Š”๋ฐ onServerConnected()

์—์„œ๋Š” Bind ํด๋ž˜์Šค๋ฅผ return ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ์ •์˜ํ•œ update, query, delete, insert 4๊ฐœ์˜ method ๋ฅผ ํ™œ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ (B)์—์„œ ์ƒ์„ฑํ•œ AIDL ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

AidlProvider provider = AidlProvider.Stub.asInterface(Binder bind)

์ด๋ ‡๊ฒŒ ์ƒ์„ฑ๋œ provider ๋Š” bind.insert();bind.update();bind.delete();bind.query();

๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค .

private ServiceConnection conn = new ServiceConnection() {

@Override

public void onServiceDisconnected(ComponentName name) {

Toast.makeText(context, “-ServiceDisconncted”, 10).show();

}

@Override

public void onServiceConnected(ComponentName name, IBinder service) {

Toast.makeText(context, “-ServiceConneted”, 10).show();

bind = AidlProvider.Stub.asInterface(service);

}

};

@Sample@ : AIDL ํด๋” ์ฐธ์กฐ

  1. USER-PERMISSION

(1) ์ž์‹ ์ด ์ƒ์„ฑํ•œ Applcation ์— Permission ์ง€์ •

<permission

android:description=”@string/permdesc_required”

android:label=”๊ถŒํ•œ์ด ์š”๊ตฌ๋ฉ๋‹ˆ๋‹ค.”

android:name=”edu.jaen.permission”

android:protectionLevel=”signature”

/>

(2) Permission ํš๋“

<uses-permission android:name=”edu.jaen.permission”/>

@Sample@ : B2.PermissionClient, B2.PermissionProject

  1. ๊ธฐํƒ€

(1) ํ•˜์œ„ ๋ฒ„์ „ OS ํ™˜๊ฒฝ์—์„œ ์ƒ์œ„๋ฒ„์ „ ๊ธฐ๋Šฅ ์‚ฌ์šฉํ•˜๊ธฐ

– android-support_v4 : ํ•˜์œ„ ๋ฒ„์ „์—์„œ ์ƒ์œ„ OS ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก External ํ˜•ํƒœ๋กœ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์ œ๊ณต๋œ๋‹ค. ํ•ด๋‹น Lib ๋Š”APK ์— ํฌํ•จ๋˜์–ด ํ•˜์œ„ OS ์—์„œ๋„ ๋™์ž‘ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.

(2) ApplicationManager

(3) SQLLite

1 thought on “Android Basic

  1. Wow, wonderful blog layout! How long have you
    been blogging for? you make blogging look easy. The overall look of your web site is excellent, let alone
    the content!

Leave a Reply

Your email address will not be published. Required fields are marked *