2015-01-04 4 views
0

일부 이벤트를 기반으로 응용 프로그램에 알림을 구현하려고합니다. 알림을 실행하는 데 필요한 활동의 ​​컨텍스트를 제외한 모든 것이 좋습니다.응용 프로그램의 전역 작업 컨텍스트

비 활동 클래스에서 계산을 수행하는 방법이 있고 컨텍스트를 전달하여 알림 클래스를 호출하지만 제대로 작동하지 않거나 잘못되었습니다. 여기

내 코드입니다

는 활동 클래스

@Override 
protected void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_s); 
    acti = sActivity.this; 
    sSingleton.getInstance().init(sActivity.this); 
    } 
public static sActivity get(){ 
    return acti; 
} 
sActivity acti = null; 

내가 signalton 또는 정적 방법 여기

을 통해 두 가지를 시도하고 내 signalton입니다

public class sSingleton { 
    private static sActivity appContext; 

    private sSingleton(){} 

    public void init(sActivity context){ 
     if(appContext == null){ 
      appContext = context; 
     } 
    } 

    public static sActivity getContext(){ 
     return appContext; 
    } 

    public static sActivity get(){ 
     return getInstance().getContext(); 
    } 

    private static sSingleton instance; 

    public static sSingleton getInstance(){ 
     return instance == null ? 
       (instance = new sSingleton()): 
       instance; 
    } 
} 

내 notitification 클래스

public class sNotification { 

    public sNotification(sActivity activity, ArrayList<String> data) { 
     this.activity = activity; 
     this.allData = new ArrayList<String>(); 
     this.allData = data; 
     createNotification(); 
    } 

    public void createNotification(){ 
      NotificationCompat.Builder mBuilder = 
       new NotificationCompat.Builder(activity) 
         .setSmallIcon(R.drawable.ic_stat) 
         .setContentTitle("New Data").setColor(Color.RED) 
         .setContentText(type + " : "+ value); 
     NotificationCompat.InboxStyle inboxStyle = new NotificationCompat.InboxStyle(); 
     inboxStyle.setBigContentTitle("New Details"); 
     for(int i = 0; i < allData.size(); i++){ 
      inboxStyle.addLine(type + ": "+ value); 
     } 
     Intent notificationIntent = new Intent(sSignalton.get(), sActivity.class); //crashing here 
       notificationIntent.putExtra("Notification", "Notify"); 
     PendingIntent contentIntent = PendingIntent.getActivity(sSignalton.get(), 0, notificationIntent, 
       PendingIntent.FLAG_UPDATE_CURRENT); 
     mBuilder.setStyle(inboxStyle); 
     mBuilder.setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)); 
     mBuilder.setContentIntent(contentIntent); 

     // Add as notification 
     NotificationManager manager = (NotificationManager) sApplication.get().getSystemService(sActivity.get().NOTIFICATION_SERVICE); 
     manager.notify(001, mBuilder.build()); 
    } 

    sActivity activity; 
    public static String TAG = "sNotification"; 
} 

중요한 점은 여기 알림 클래스에서 sActivity 컨텍스트를 얻는 방법을 모르겠다. 나는 signalton과 sActivity.get() 정적 메서드를 모두 시도했지만 응용 프로그램이 파괴되고 알림 조건이 true가되면 응용 프로그램이 충돌합니다. 앱이 포 그라운드에 있지 않으면 서비스가 작동하지 않고 서비스 만 실행됩니다.

+0

활동 컨텍스트의 정적 참조 보유가 너무 잘못되었습니다. 아마도 디자인 접근법을 다시 생각해야합니다. – waqaslam

+0

깨끗한 방법으로 해보기위한 제안 ...? – user3290805

+0

통지에 서비스 컨텍스트를 전달할 수 있어야합니다. –

답변

0

당신은 Service 전달을 시도 할 수 있습니다 :

public void createNotification(Context context){ 
... 
} 
0

당신은 항상 당신이 getApplicationContext()를 호출하여 Activity 또는 Service에서 얻을 수있는 글로벌 애플리케이션 컨텍스트를 사용할 수 있습니다. 이 ContextNotifications을 만드는 클래스에 전달할 수 있습니다.

모든 싱글 톤 쓰레기를 제거하십시오. 그럴 필요는 없으며 단지 메모리 누수를 일으킬 것입니다.

관련 문제