땡겨서 새로고침 기능. Pull To Refresh.


이전에 사용하던 pull to refresh lib는 더이상 사용하지 않는 듯 하고 ...

안드로이드에서 제공하는 SwipeDrawer도 17부터 deprecated 돼버려서 ...

검색 해보니 커스텀 가능한 pull to refresh lib를 소개합니다.


"CustomSwipeRefreshLayout"


https://github.com/xyxyLiu/SwipeRefreshLayout

 
 


ListView, ViewPager, WebView 에서 사용 가능하고,

기존에 SwipeDrawer처럼 Progress Bar만 남기고 view가 사라지기도 하고,

기존의 pull to refresh처럼 현재 진행상태를 상단 view에서 표시하는 것도 가능합니다.


1. build.gradle에 아래 한 줄 추가 해 주시구요.

compile 'com.reginald.swiperefresh:library:1.1.0'


2. layout

(progress bar를 사용하지 않기 때문에 transparent로 지정했습니다.)

<com.reginald.swiperefresh.CustomSwipeRefreshLayout xmlns:swiperefresh="http://schemas.android.com/apk/res-auto"
android:id="@+id/layout_refresh"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/transparent"
swiperefresh:enable_top_progress_bar="true"
swiperefresh:keep_refresh_head="true"
swiperefresh:refresh_mode="pull_mode"
swiperefresh:return_to_header_duration="500"
swiperefresh:return_to_top_duration="500"
swiperefresh:time_out_refresh_complete="500"
swiperefresh:time_out_return_to_top="500"
swiperefresh:top_progress_bar_color_1="@android:color/transparent"
swiperefresh:top_progress_bar_color_2="@android:color/transparent"
swiperefresh:top_progress_bar_color_3="@android:color/transparent"
swiperefresh:top_progress_bar_color_4="@android:color/transparent">

<RelativeLayout
android:id="@+id/rl_main"
android:layout_width="match_parent"
android:layout_height="match_parent">
</RelativeLayout>

</com.reginald.swiperefresh.CustomSwipeRefreshLayout>


3. MainActivity

public class MainActivity extends Activity {
private CustomSwipeRefreshLayout swipeRefreshLayout;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

// pull to refresh
swipeRefreshLayout = (CustomSwipeRefreshLayout) findViewById(R.id.layout_refresh);

swipeRefreshLayout.setCustomHeadview(new RefreshView(this));
swipeRefreshLayout.setTriggerDistance(50);
swipeRefreshLayout.setOnRefreshListener(new CustomSwipeRefreshLayout.OnRefreshListener() {
@Override

 swipeRefreshLayout.setOnRefreshListener(new CustomSwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
// refresh 처리
}
});

}


4. RefreshView

public class RefreshView extends LinearLayout implements CustomSwipeRefreshLayout.CustomSwipeRefreshHeadLayout {

private static final boolean DEBUG = false;

private static final SparseArray<String> STATE_MAP = new SparseArray<>();
private ViewGroup mContainer;
private ImageView mImageView;
private ImageView mProgressBar;
private int mState = -1;
private Animation loadingAnim;
private Context context;

{
STATE_MAP.put(0, "STATE_NORMAL");
STATE_MAP.put(1, "STATE_READY");
STATE_MAP.put(2, "STATE_REFRESHING");
STATE_MAP.put(3, "STATE_COMPLETE");
}

public RefreshView(Context context) {
super(context);
this.context = context;
setupLayout();
}

private void setupLayout() {
ViewGroup.LayoutParams lp = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
mContainer = (LinearLayout) LayoutInflater.from(getContext()).inflate(R.layout.view_main_refresh, null);
addView(mContainer, lp);
setGravity(Gravity.BOTTOM);
mImageView = (ImageView) findViewById(com.reginald.swiperefresh.R.id.default_header_arrow);
mProgressBar = (ImageView) findViewById(com.reginald.swiperefresh.R.id.default_header_progressbar);
loadingAnim = AnimationUtils.loadAnimation(context, R.anim.anim_loading_rotate);
setBackgroundColor(ContextCompat.getColor(context, android.R.color.transparent));
}

@Override
public void onStateChange(CustomSwipeRefreshLayout.State state, CustomSwipeRefreshLayout.State lastState) {
if (DEBUG)
Log.d("csrh", "onStateChange state = " + state + ", lastState = " + lastState);
int stateCode = state.getRefreshState();
int lastStateCode = lastState.getRefreshState();
float percent = state.getPercent();

switch (stateCode) {
case CustomSwipeRefreshLayout.State.STATE_NORMAL:
if (percent > 0.5f) {
setImageRotation((percent - 0.5f) * 180 / 0.5f);
} else {
setImageRotation(0);
}

if (stateCode != lastStateCode) {
//normal 상태처리
}
break;
case CustomSwipeRefreshLayout.State.STATE_READY:
if (stateCode != lastStateCode) {
//refresh 준비
setImageRotation(180);
}
break;
case CustomSwipeRefreshLayout.State.STATE_REFRESHING:
if (stateCode != lastStateCode) {
// refresh 중의 view처리
}
break;

case CustomSwipeRefreshLayout.State.STATE_COMPLETE:
if (stateCode != lastStateCode) {
// refresh가 끝난 후 view 처리
}
break;
default:
}
mState = stateCode;
}


private void setImageRotation(float rotation) {
int currentapiVersion = android.os.Build.VERSION.SDK_INT;
if (currentapiVersion >= android.os.Build.VERSION_CODES.HONEYCOMB) {
mImageView.setRotation(rotation);
} else {
if (mImageView.getTag() == null){
mImageView.setTag(0f);
}
mImageView.clearAnimation();
Float lastDegree = (Float)mImageView.getTag();
RotateAnimation rotate = new RotateAnimation(lastDegree, rotation,
Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
mImageView.setTag(rotation);
rotate.setFillAfter(true);
mImageView.startAnimation(rotate);
}
}
}

 

문자 수신 시 앱에서 문자를 인식 할 수 있습니다.


Receiver 하나 등록하면 바로 가능합니다.


1. AnddroidManifest에 permission 등록 및 receiver 등록

<!-- SMS receive permission -->
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<!-- SMS read -->
<uses-permission android:name="android.permission.READ_SMS" />
<!-- SMS receiver -->
<receiver android:name=".receiver.SmsReceiver">
<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>

2. BroadCaseReceiver class 만들기

public class SmsReceiver extends BroadcastReceiver {
public static final String TAG = "SmsReceiver";
public static final String ACTION = "android.provider.Telephony.SMS_RECEIVED";

@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(ACTION)) {
Bundle bundle = intent.getExtras();
if(null == bundle) {
return;
}

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
SmsMessage[] smsMessages = Telephony.Sms.Intents.getMessagesFromIntent(intent);

for(int i = 0 ; i < smsMessages.length ; i++) {
SmsMessage smsMessage = smsMessages[i];
setMessage(context, smsMessage);
}
} else {
Object[] pdusObj = (Object[]) bundle.get("pdus");
if(null == pdusObj) {
return;
}
SmsMessage[] smsMessages = new SmsMessage[pdusObj.length];
for(int i = 0 ; i < pdusObj.length ; i++) {
smsMessages[i] = SmsMessage.createFromPdu((byte[]) pdusObj[i]);

setMessage(context, smsMessages[i]);
}
}
}
}

private void setMessage(Context context, SmsMessage smsMessages) {
Log.d(TAG, "DisplayMEssageBody :: " + smsMessages.getDisplayMessageBody());
Log.d(TAG, "DisplayOrinatingAddress" + smsMessages.getDisplayOriginatingAddress());
Log.d(TAG, "EmailBody :: " + smsMessages.getEmailBody());
Log.d(TAG, "originatingAddress :: " + smsMessages.getOriginatingAddress());
Log.d(TAG, "MessageBody :: " + smsMessages.getMessageBody());
Log.d(TAG, "serviceCenterAddress :: " + smsMessages.getServiceCenterAddress());
Log.d(TAG, "time :: " + smsMessages.getTimestampMillis());

// Todo 요기에서 message를 가지고 작업하시면 됩니다.
}
}

 

public static int getpToPx(Context context, int dp) {
    return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, context.getResources().getDisplayMetrics());
}

 

내부 저장소 용량 구하기.


1. 총 용량

public static String getLocalTotalMemory() {
File path = Environment.getDataDirectory();
StatFs stat = new StatFs(path.getPath());
long blockSize = 0;
long totalBlocks = 0;
if(Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR2) {
blockSize = stat.getBlockSizeLong();
totalBlocks = stat.getBlockCountLong();
} else {
blockSize = stat.getBlockSize();
totalBlocks = stat.getBlockCount();
}
return formatMemorySize(totalBlocks * blockSize);
}

2. 사용가능한 용량

public static String getCurrentRemainLocalMemory() {
File path = Environment.getDataDirectory();
StatFs stat = new StatFs(path.getPath());
long blockSize = 0;
long availableBlocks = 0;
if(Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR2) {
blockSize = stat.getBlockSizeLong();
availableBlocks = stat.getAvailableBlocksLong();
} else {
blockSize = stat.getBlockSize();
availableBlocks = stat.getAvailableBlocks();
}

return formatMemorySize(availableBlocks * blockSize);
}


3. 용량의 단위 정하기

public static String formatMemorySize(long memory) {
String suffix = null;

double size = 0;

if(memory >= 1024){
suffix = "_KB";
size = (double) (memory / 1024);

if(size >= 1024) {
suffix = "_MB";
size = (double) (size / 1024);

if(size >= 1024) {
suffix = "_GB";
size = (double) (size / 1024);
}
}
}

size = Math.round(size * 10d)/10d;

StringBuilder resultBuffer = new StringBuilder(Double.toString(size));

if(suffix != null){
resultBuffer.append(suffix);
}

return resultBuffer.toString();
}

ListView를 대용해 사용가능한 RecyclerView

CardView, 가로 스크롤, 세로 스크롤 등 활용도가 높음


1.xml

layout의 원하는 위치에 Recyclerview를 넣는다.

<android.support.v7.widget.RecyclerView
android:id="@+id/list_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:color/transparent"></android.support.v7.widget.RecyclerView>


2. 초기화

public class TestActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {

RecyclerView listView = (RecyclerView) view.findViewById(R.id.list_view);
LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity());
layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL); // horizonta, vertical 옵션에 따라 가로/세로 list
listView.setHasFixedSize(true);
listView.setLayoutManager(layoutManager);

TestAdapter adapter = new TestAdapter(getActivity(), R.layout.row_item, testarrayList);
listView.setAdapter(adapter);

}
}


3. Adapter

class TestAdapter extends RecyclerView.Adapter<TestAdapter.ViewHolder> {
private final int resource;
private Context context;
private List<String> list;

public TestAdapter(Context context, @AnyRes int resource, List<String> list) {
this.resource = resource;
this.context = context;
this.list = list;
}

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(context).inflate(resource, null);

return new ViewHolder(view);
}

@Override
public void onBindViewHolder(ViewHolder holder, int position) {
final String item = getItem(position);

holder.title.setText(item);

}

@Override
public int getItemCount() {
return list.size();
}

private String getItem(int position) {
return list.get(position);
}

public void clear() {
if(null != list) {
list.clear();
}
}

public void addAll(List<String> list) {
this.list = list;
notifyDataSetChanged();
}

public class ViewHolder extends RecyclerView.ViewHolder {
public final TextView title;

public ViewHolder(View parent) {
super(parent);


title= (TextView) parent.findViewById(R.id.title);
}
}
}

 

'안드로이드' 카테고리의 다른 글

db -> px 단위 변경  (0) 2017.03.06
안드로이드 내부 저장소 용량 구하기  (0) 2017.03.06
공유 가능 앱 리스트 가져오기  (0) 2017.03.06
안드로이드 앱의 cpu 사용량 구하기  (0) 2017.03.06
AsyncTask  (0) 2011.09.06

안드로이드 공유하기에 흔히 사용하는 Intent.

공유하기 팝업을 커스텀 하고 싶을 때 list만 가져와서 dialog를 만들면 된다.


Intent shareIntent = new Intent(Intent.ACTION_SEND);
shareIntent.setType("text/plain");

List<ResolveInfo> resolveInfoList = context.getPackageManager().queryIntentActivities(shareIntent, 0);


​앱 선택 시 처리


ResolveInfo resolveInfo = resolveInfoList.get(selectPosition);
ActivityInfo activityInfo = resolveInfo.activityInfo;

ComponentName name = new ComponentName(activityInfo.applicationInfo.packageName, activityInfo.name);
shareIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
shareIntent.setComponent(name);

//TODO ssok by 추후 공유 메시지, url 변경 필요
shareIntent.putExtra(Intent.EXTRA_TEXT, "공유하고자 하는 문구");

startActivity(shareIntent);

 

'안드로이드' 카테고리의 다른 글

안드로이드 내부 저장소 용량 구하기  (0) 2017.03.06
안드로이드 RecyclerView 사용하기 예제  (0) 2017.03.06
안드로이드 앱의 cpu 사용량 구하기  (0) 2017.03.06
AsyncTask  (0) 2011.09.06
AppWidget  (0) 2011.07.28

안드로이드 앱의 cpu 사용량 구하기. 코드

            ActivityManager activity_manager = (ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.RunningAppProcessInfo> runningApps = activity_manager.getRunningAppProcesses();
Runtime runtime = Runtime.getRuntime();
Process process;
try {
String cmd = "top -n 1";
process = runtime.exec(cmd);
InputStream inputStream = process.getInputStream();
InputStreamReader inputReader = new InputStreamReader(inputStream );
BufferedReader bufferReader = new BufferedReader(inputReader );
String line;

while ((line = bufferReader.readLine()) != null) {
String[] segs = line.trim().split("[ ]+");

for (int i = 0; i < runningApps.size(); i++) {
if (segs[0].equalsIgnoreCase(String.valueOf(runningApps.get(i).pid))) { <--하나의 process의 cpu만 확인하고 싶은 경우 for문을 제외하고, pid값에 원하는 process의 pid 값을 넣어 확인.
cpuAvail += Integer.parseInt(segs[2].replace("%", "")); <-- 현재 사용중인 프로세스들의 총 cpu 사용량을 구하기 위한 합.
// break;
}
}
}

} catch (Exception e) {
e.printStackTrace();
return 0;
}

 

 

'안드로이드' 카테고리의 다른 글

안드로이드 RecyclerView 사용하기 예제  (0) 2017.03.06
공유 가능 앱 리스트 가져오기  (0) 2017.03.06
AsyncTask  (0) 2011.09.06
AppWidget  (0) 2011.07.28
Broadcast Receiver  (0) 2011.07.26
출처 : http://neptjuno.tistory.com/33

public abstract class AsyncTask extends Object

세 가지 generic type(Params, Progress, Result)과 네 가지 step (onPreExecute, doInBackground, onProgressUpdate, onPostExecute)으로 구성

1. generic type
  1) Params : 실행 될 때 task에 전달된 파라미터의 type
  2) Progress : 백스라운드에서 작업하는 동안 발생되는 progress unit의 type
  3) Result : 백그라운드 작업에서 처리된 결과의 type
private class MyTask extends AsyncTask<void, void, void> {...}
private class MyTask extends AsyncTask<URL, Integer, Long>{...}
(필요없는 type에 대해서는 void로 작성)

2. step
  1) onPreExecute()
      - UI thread에서 호출된 즉시 호출되는 메소드
      - task를 setup하는 데 사용

  2) doInBackground(Params .. )
     - onPreExecute()의 수행이 끝난 후 백그라운드로 즉시 호출.
     - 긴 수행 시간을 요하는 작업을 백그라운드로 수행하는 역할
     - asynchronous task의 파라미터는 이 때 전달.
     - 수행 결과는 이 단계에서 반환되어야 하며 마지막 단계로 전달
     - publishProgress(Progress..)를 사용할 수 있으며 이 값들은 onProgressUpdate(Progress..)단계로 인해 UI thread에 불려지게 됨

  3) onPostExecute(Result)
      - 백그라운드 작업이 종료된 후에 UI thread에 호출되는 함수
      - 백그라운드에 계산된 결과가 이 단계의 파라미터로 전달됨

3. Threading rules
    - 이 task instance는 UI thread에서 생성되어져야만 한다.
    - execute(Param..)은 UI thread에서 호출되어져야만 한다.
    - onPreExecute(), onPostExecute(Result), doInBackground(Params..), onProgressUpdate(Progress..)는 수동으로 호출하지 않는다.
    - task는 오직 한번만 수행 될 수 있다.

출처 : http://tigerwoods.tistory.com/28


AsyncTask class
- backgrount 작업을 위한 모든 일(thread 생성, 작업 실행 UI와 통신 등)을 추상화 함으로 각각의 background 작업을 객체 단위로 구현/관리 할 수 있게 하는 것이 목적

type을 정할 필요가 없는 generic이 있다면 void전달

  • protected void onPreExecute():
     Background 작업이 시작되자마자 UI스레드에서 실행될 코드를 구현해야 함. (예. background 작업의 시작을 알리는 text표현, background 작업을 위한 ProgressBar popup등)
  • protected abstract Result doInBackground(Params… params):
    Background에서 수행할 작업을 구현해야 함. execute(…) 메소드에 입력된 인자들을 전달 받음.
  • void onProgressUpdate(Progress... values):
    publishProgress(…) 메소드 호출의 callback으로 UI스레드에서 보여지는 background 작업 진행 상황을 update하도록 구현함. (예. ProgressBar 증가 등)
  • void onPostExecute(Result result):
    doInBackground(…)가 리턴하는 값을 바탕으로 UI스레드에 background 작업 결과를 표현하도록 구현 함. (예. background작업을 계산한 복잡한 산술식에 대한 답을 UI 위젯에 표현함 등)
  • void onCancelled():
    AsyncTask:cancel(Boolean) 메소드를 사용해 AsyncTask인스턴스의 background작업을 정지 또는 실행금지 시켰을 때 실행되는 callback. background작업의 실행정지에 따른 리소스복구/정리 등이 구현될 수 있다.
background 작업의 시작과 background 작업 중 진행정보의 UI스레드 표현
1) final AsyncTask<…> execute(Params… params):
Background 작업을 시작한다. 꼭 UI스레드에서 호출하여야 함. 가변인자를 받아들임으로 임의의 개수의 인자를 전달할 수 있으며, 인자들은 doInBackground(…) 메소드로 전달된다.

2) final void publishProgress(Progress... values):
Background 작업 수행 중 작업의 진행도를 UI 스레드에 전달 함. doInBackground(…)메소드 내부에서만 호출.

AsyncTask인스턴스는 자기 자신을 pending, running, finished 이렇게 세 가지 상태(status)로 구분하는데 각각 AsyncTask:Status 클래스에 상수 PENDING, RUNNING, FINISHED로 표현 될 수 있다

public final AsyncTask.Status getStatus()
를 이용해 인스턴스 상태를 얻을 수 있음.
PENDING, RUNNING, FINISHED 중에서 리턴

'안드로이드' 카테고리의 다른 글

공유 가능 앱 리스트 가져오기  (0) 2017.03.06
안드로이드 앱의 cpu 사용량 구하기  (0) 2017.03.06
AppWidget  (0) 2011.07.28
Broadcast Receiver  (0) 2011.07.26
나인패치  (0) 2011.07.26

AppWidget
- 다른 앱의 일부 영역만을 차지한 채 주기적으로 갱신되는 조그만 앱
- Home Screen에 떠 있는 어플리케이션의 미니어쳐
- AppWidget Host의 일부 영역을 독점적으로 차지하며 자신의 고유한 기능을 수행
- 요약적인 정보를 표시하는 것이 주된 기능
- 간단한 명령 가능
- 복수 개의 인스턴스 설치 가능


AppWidget Host
- Home Screen이 대표적
- 일부런쳐 프로그램도 App Widget Host 기능 수행 가능

AppWidget Manager
- AppWidget을 관리하는 관리자
- 설치된 AppWidget의 목록을 가지며 미리 지정한 시간이 될 때마다 AppWidget에게 신호를 보내 상태를 갱신
- 객체 구현
   + static AppWidgetManager getInstance(Context context)
- App Widget 관련 정보 조사하는 method
   + List<AppWidgetProviderInfo> getInstalledProviders()
   + AppWidgetProviderInfo getAppWidgetInfo(int appWidgetId)
   + int[] getAppWidgetIds (ComponentName provider)
- AppWidgetProviderInfo class
   + AppWidget의 여러가지 속성을 정의
   + 크기, 갱신 주기, 설정 Activity에 대한 정보를 갖음

AppWidget 속성
- AppWidgetProviderInfo class로 기술
   xml 문서로 작성하여 manifest에 meta-data로 포함 (경로 /res/xml/)
- minWidth. minHeight
   AppWidget이 차지할 화면상의 크기 지정
   장치 독립성 확보를 위해 dip 단위를 사용하는 것을 권장
   Home Screen은 4X4 크기의 셀로 구성
   각 셀의 크기는 72dip x 72dip
- updatePeriodMillis
   갱신 신호를 보낼 주기를 지정
   갱신 주기는 1/1000초 단위로 지정할 수 있지만 너무 자주 갱신할 필요는 없음
   갱신 주기는 배터리 성능에 직접적인 영향을 미치므로 가급적 길게 설정할 것을 권장
   1시간 미만의 주기는 권장되지 않음 ( 최소 갱신 주기가 30분으로 정해져있음. - 갱신주기를 짧게 줘도 30분에 한번만 갱신 )
   자주 갱신해야 하는 정보일 경우 (슬라이드 쇼, 주식 시황)는 타이머나 알람을 사용
   알람은 주기를 자유롭게 선택 가능하며 장비가 슬립모드일 때는 동작하지 않음
- initialLayout
   AppWidget의 Layout 기술
   RemoteViews class로만 layout의 정보만 전달하는데 이 클래는 모든 widget만 지원하지 않음
   => layout : LinearLayout, RelativeLayout, FrameLayout
   => View : Button, TextView, ImageView, Progress Bar
   => 기타 : ImageButton, AnalogClock, Chronometer
-configure
  옵션 사항을 편집할 설정 Activity 지정
   Activity class를 밝혀 놓으면 AppWidget이 최초 설치 될 때 호스트에 의해 설정 Activity가 자동으로 호출
   별다른 설정 사항이 없을 경우 이 속성을 생략해도 무방

AppWidget Life Cycle
- AppWidget은 간단한 출력도 Host에게부탁
- 이 통신 사이에서 사용되는 중간 매개체가 RemoteViews
- Android에서 프로세스끼리 통신하는 공식적인 방법은 BroadcastReceiver
- Appwidget은 Host가 보내주는 신호를 받아야 하므로 기본적으로 BR를 구현
- Host와 AppWidget이 주고받는 방송은 AppWidgetManager class에 정의돼 있다.
  = ACITON_APPWIDGET_ENABLED
    첫 번재 인스턴스가 설치될 때 전달
    이제부터 동작을 시작하니 준비하라는 신호.
    예 : 정보 저장을 위한 DB를 생성하거나 파일 목록을 미리 조사해 놓는 것
    AppWidget이 이미 설치 돼 있는 상태에도 부팅 될 때도 전달
  = ACTION_APPWIDGET_DELETED
    AppWidget 인스턴스 중 일부가 삭제 될 때 전달.
  = ACTION_APPWIDGET_DISABLED
     마지막 인스턴스가 제거 될 때 전달
     사용하던 데이터베이스나 임시 파일을 삭제
     ENABLED에서 별도의 초기화를 하지 않아 정리할 것이 없다면 이 방송은 무시해도 됨
     모든 인스턴스가 제거 될 때 AppWidget BR자체가 불증화 되어 더 이상 방송을 수신할 수 없는 상태가 되기 때문에 DISABLED
  = ACTION_APPWIDGET_UPDATE
    개별 AppWidget을 갱신할 때마다 전달
    인스턴스가 새로 설치될 때가 대표적
    갱신 주기가 됐을 때나 장비구 부팅될 때도 다시 그려야 하므로 이 방송이 전달
    AppWidget은 이 방송을 받았을 때 출력할 정보를 재 조사하고 자신을 다시 그린다.
    이 방송을 처리함으로써 위젯의 정보가 사용자에게 출력
    인텐트로는 갱신이 필요한 모든 인스턴스 ID배열이  전달

네 개의 방송 중 AppWidget이 반드시 처리해야 하는 것은 UPDATE뿐

AppWidgetProvider class (AppWidget 제공자)
- BroadcastReceiver의 서브 클래스
onReceive를 재정의 하여 각 액션에 다음 메서드 호출
- void onEnabled(Context context)
- void onDeleted(Context context, int[] appWidgetIds)
- void onDisabled(context context)
- void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds)
AppwidgetProvider는 위젯을 위한 방송을 받아 각 메소드로 분배하는 단순한 역할을 하는 도우미 클래스일 뿐, 이 클래스를 상속받고 필요한 메서드를 재정의하여 AppWidget 제작
BroadcasReceiver의 서브 클래스 이므로 onReceive 메서드도 당연히 존재하나 AppWidgetprovider가 방송분배를 위해 재정의 하고 잇으므로 서브클래스는 가급적이면 재정의하지 않는 것이 좋다.


레이아웃 내부 위젯 속성 지정
void setimageViewResource(int viewId, int srcId)
void setProgressBar(int viewId, int max, int progress, boolean indeterminate)
void setTextColor(int viewid, int color)
void setTextViewText(int viewId, CharSequence text)

갱신
void updateAppWidget(int appWidgetid, RemoteViews views)
void updateAppWidget(int[] appWidgetIds, RemoteViews views)
void updateAppWidget(Component provider, RemoteViews views)

'안드로이드' 카테고리의 다른 글

안드로이드 앱의 cpu 사용량 구하기  (0) 2017.03.06
AsyncTask  (0) 2011.09.06
Broadcast Receiver  (0) 2011.07.26
나인패치  (0) 2011.07.26
Data Base  (0) 2011.07.25

Broadcast Receiver를 호출하는 method
- sendBroadcast(Intent intent[String srceiverPermission]);
   * 응용프로그램에서 실행될 intent를 전송
   * 허가받은 수신자에게만 방송을 보내고 싶다면 permission도 지정이 가능
   * permmission이 필요 없다면 null이나 생략 가능

- sendOrderBroadcast(Intent intent, String receiverPermission, BroadcastReceiver resultReceiver, Handler schduler, int initialCode, String initialData, Bundle initialExtras)
   * 실행될 intent, android:priority, 실행될 BR, 리턴받은 번들값을 지정해 실행

- registerReceiver(BroadcastReceiver receiver, intentFilter filter)
   * 항상 Broadcast를 수신대기 하고 있는 경우지만 원활할 때만 수신대기 하도록 manifest에 등록하거나 registerReceiver method를 통해 지정하면 등록돼어 실행

- unregisterReceiver(BroadcastReceiver receiver)
   * registerReceiver method를 통해 등록된 것을 해제


자바 코드로 Broadcast Receiver 등록
1. cast 날리기
   Intent intent = new Intent();
   intent.putExtra(Statickeyword.xxxx, true);
   intent.setAction(Statickeyword.xxxx);
   context.sendBroadcast(intent);

2. cast 감지, 처리
   2_1 Broadcast 생성
         BroadcastReceiver br=new BroadcastReceiver(){
         @Override
          public void on Receive(Context context, Intent intent){
         }
    2_2 필터 생성
        private IntentFilter filter = new IntentFilter();
        filter.addAction(Statickeyword.xxxx);

3. Activity 등록
    @Override
         public void onResume(){
         super.onResume();
         registerReceiver(br, filter);
         }

4. 해제
    @Override
         public void onPause(){
         super.onPause();
         unregisterReceiver(br);
         }

Receiver를 Activity에 등록하면 Activity가 활성화 상태에서만 cast에 반응
Broadcast Receiver class를 상속하여 onReceiver method를 오버라이딩 하고 manifest에 추가하면 Activity 상태와 무관하게 cast요청 감지.

'안드로이드' 카테고리의 다른 글

AsyncTask  (0) 2011.09.06
AppWidget  (0) 2011.07.28
나인패치  (0) 2011.07.26
Data Base  (0) 2011.07.25
broadcast receiver java code로 등록  (0) 2011.07.25

+ Recent posts