마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

앱위젯 일정시간 지난후에 클릭 불능

0 추천
package com.example.line4crewdiary;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Calendar;
import java.util.Date;
 
 

import java.util.GregorianCalendar;
import com.example.line4crewdiary.Data;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.graphics.Color;
import android.os.Bundle;
import android.util.Log;
import android.util.TypedValue;
import android.view.View;
import android.widget.RemoteViews;
import android.widget.Toast;

/**
 * 위젯의 상태를 주기적으로 갱신하는 예제
 * 
 * @author Eye
 * @since 2011.04.01
 */
public class MainWidget2 extends AppWidgetProvider
{
 private static final String TAG = "HelloWidgetProvider";
 private static final int WIDGET_UPDATE_INTERVAL = 3600000;
 //private static final int WIDGET_UPDATE_INTERVAL = 10000;
 private static PendingIntent mSender;
 private static AlarmManager mManager;
 public int appWidgetId;
 public static final String DATABASE_CHANGED = "data update";
 public static final String CLICK_ACTION = "com.example.line4crewdiary.CLICK";
 //private PendingIntent service = null;
 
 
 
 
 
 
 /* (non-Javadoc)
  * @see android.appwidget.AppWidgetProvider#onReceive(android.content.Context, android.content.Intent)
  */
 @Override
 public void onReceive(Context context, Intent intent)
 {
  super.onReceive(context, intent);
  
        
  String action = intent.getAction();
  
  
  // 위젯 제거 인텐트를 수신했을 때
  if(action.equals("android.appwidget.action.APPWIDGET_DISABLED"))
  {
   Log.w(TAG, "android.appwidget.action.APPWIDGET_DISABLED"); 
   removePreviousAlarm();
  }  
  // 위젯 업데이트 인텐트를 수신했을 때
  else if (action.equals("android.appwidget.action.APPWIDGET_UPDATE"))
  {
   Log.w(TAG, "android.appwidget.action.APPWIDGET_UPDATE");
   removePreviousAlarm();
   
   long firstTime = System.currentTimeMillis() + WIDGET_UPDATE_INTERVAL;
   mSender = PendingIntent.getBroadcast(context, 0, intent, 0);
   mManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
   mManager.set(AlarmManager.RTC, firstTime, mSender);
  }
  
  else if(intent.getAction().equals(DATABASE_CHANGED)){
   
       
   AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
   int[] appWidgetIds;
   appWidgetIds = appWidgetManager.getAppWidgetIds(new ComponentName(context, getClass()));
   
   final int N = appWidgetIds.length;
   for(int i = 0 ; i < N ; i++)
   {
    appWidgetId = appWidgetIds[i];
   }
   ComponentName cpName = new ComponentName(context, MainWidget2.class);
    RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.hellowidget_layout2);
   appWidgetManager.updateAppWidget(cpName, views);
   updateAppWidget(context, appWidgetManager, appWidgetId);
  }
 }
 
     
 
 /* (non-Javadoc)
  * @see android.appwidget.AppWidgetProvider#onUpdate(android.content.Context, android.appwidget.AppWidgetManager, int[])
  */
 
 
 @Override
 public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds)
 {
  
  
  // 현재 클래스로 등록된 모든 위젯의 리스트를 가져옴
  
  appWidgetIds = appWidgetManager.getAppWidgetIds(new ComponentName(context, getClass()));
  super.onUpdate(context, appWidgetManager, appWidgetIds);
  final int N = appWidgetIds.length;
  for(int i = 0 ; i < N ; i++)
  {
   appWidgetId = appWidgetIds[i];
   
   //인텐드와 엑티비티를 연결한다.
         Intent intent = new Intent(Intent.ACTION_MAIN);
         intent.addCategory(Intent.CATEGORY_LAUNCHER);
         intent.setComponent(new ComponentName(context, MainActivity.class));
         PendingIntent pendingIntent = PendingIntent.getActivity(context, 0 , intent,0); 
         
         // 버튼이 눌린 후 실행할 엑티비티를 인텐드에 결합한다.
         RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.hellowidget_layout2);
         views.setOnClickPendingIntent(R.id.widgetlayout, pendingIntent);
    
   appWidgetManager.updateAppWidget(appWidgetId, views);
   updateAppWidget(context, appWidgetManager, appWidgetId); 
   
   //Toast.makeText(context, "위젯 업데이트 완료", Toast.LENGTH_SHORT).show();
   
  }
 }
 /**
  * 위젯의 형태를 업데이트합니다.
  * 
  * @param context 컨텍스트
  * @param appWidgetManager 위젯 메니저
  * @param appWidgetId 업데이트할 위젯 아이디
  */
 
 //static final ACTION_CLICK = "CLICK";
 public static void updateAppWidget(Context context, AppWidgetManager appWidgetManager, int appWidgetId)
 {
  
  위젯에 뿌려주는 부분
  
  
  appWidgetManager.updateAppWidget(appWidgetId, updateViews);
 }
  
 
 /**
  * 예약되어있는 알람을 취소합니다.
  */
 public void removePreviousAlarm()
 {
  if(mManager != null && mSender != null)
  {
   mSender.cancel();
   mManager.cancel(mSender);
  }
 }
}

캘린더 어플이 있구요.. 앱위젯에 그날의 메모를 뿌려주는식인데요..

앱위젯을 클릭하면 메인어플이 뜨는 방식..

처음에 설치하고 위젯클릭시 어플 잘 뜨는데.. 어느정도 시간이 흘러서 클릭해보면

먹통이 되는 현상이 일어나요..

어느정도 시간인지 정확히 몰라서.. 오류찾기도 힘들고 그러던중에..

디바이스 폰트 변경하면 또 갑자기 먹통이 되더라구요..

그래서 지금은 강제로 한시간마다 위젯 업데이트하게 만들어놨는데..

한시간마다 업데이트 신호가 들어가서 업뎃 하면 멈췄던 클릭이 다시 먹는듯..

그래도 타이밍상 안맞으면 안먹힐때가 있어서 불완전한 어플이 되었네요..

소스 첨부합니다.. 부디 해결해주세요.. 한달째 해결중인데 방법이 안나오네요. ㅜㅜ

 

 

민팔이 (180 포인트) 님이 2014년 1월 16일 질문

답변 달기

· 글에 소스 코드 보기 좋게 넣는 법
· 질문에 대해 추가적인 질문이나 의견이 있으면 답변이 아니라 댓글로 달아주시기 바랍니다.
표시할 이름 (옵션):
개인정보: 당신의 이메일은 이 알림을 보내는데만 사용됩니다.
스팸 차단 검사:
스팸 검사를 다시 받지 않으려면 로그인하거나 혹은 가입 하세요.
...