应用程序中的全局活动上下文

Posted

技术标签:

【中文标题】应用程序中的全局活动上下文【英文标题】:global activity context in application 【发布时间】:2015-03-02 11:31:26 【问题描述】:

我正在尝试根据某些事件在我的应用中实现通知。一切都很好,除了我需要触发通知的活动上下文。

我有一种方法可以在非活动类中进行一些计算,然后我通过传递上下文来调用通知类,但它似乎工作得不好或者我做错了什么。

这是我的代码

活动类

 @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;

我正在尝试通过信号通或静态方法两种方式

这是我的信号

    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;
    

我的通知类

    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() 静态方法但是当应用程序被销毁并且通知条件为真时应用程序崩溃.当应用程序不在前台时应用程序崩溃,只有服务正在运行。

【问题讨论】:

持有 Activity 上下文的静态引用是非常错误的。也许您应该重新考虑设计方法。 有什么建议以干净的方式进行...? 您应该能够将服务上下文传递给通知。 服务上下文?但是怎么做? 如果你想从服务而不是活动创建通知,请传入服务。服务是一个上下文。 【参考方案1】:

您可能想尝试传入Service

public void createNotification(Context context)
...

【讨论】:

【参考方案2】:

您始终可以使用全局应用程序上下文,您可以通过调用getApplicationContext()ActivityService 获取。您可以将此Context 传递给创建Notifications 的类。

删除所有单身废话。这没有必要,只会造成内存泄漏。

【讨论】:

以上是关于应用程序中的全局活动上下文的主要内容,如果未能解决你的问题,请参考以下文章

如何从外部 api 读取属性并将其设置为 springboot 中的应用程序上下文以使其全局可用?

全局助手正在覆盖流星车把模板中的本地上下文

变量对象VO与活动对象AO

上下文或活动之外的 getString

Flask中的http请求与响应

Android将项目添加到全局上下文菜单