2015-01-04 3 views
0

Я пытаюсь внедрить уведомление в своем приложении на основе некоторых событий. Все в порядке, кроме контекста активности, в которой мне нужно инициировать уведомление.контекст глобальной активности в приложении

У меня есть способ сделать некоторые вычисления в классе non-activity, а затем я вызываю класс уведомлений, передавая контекст, но это не похоже на работу, или я сделал что-то неправильно.

Вот мой код

Класс активности

@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 здесь в классе уведомлений, я пробовал как сигнальный, так и статический метод sActivity.get(), но когда приложение уничтожено, а условие уведомления становится истинным, сбои приложений. Приложение отключается, когда приложение не находится на переднем плане, работают только службы.

+0

Сохранение статической ссылки контекста активности настолько ошибочно. Возможно, вам стоит подумать о дизайне. – waqaslam

+0

любое предложение сделать это в чистом виде ...? – user3290805

+0

Вы должны иметь возможность передать контекст службы в уведомление. –

ответ

0

Вы можете попытаться пройти в Service:

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

Вы всегда можете использовать глобальный контекст приложения, который вы можете получить от Activity или Service по телефону getApplicationContext(). Вы можете передать этот Context классу, который создает Notifications.

Удалите все синглтон-дерьмо. Это не обязательно и просто собирается утечки памяти.