代码之家  ›  专栏  ›  技术社区  ›  Enes

扩展BroadcastReceiver OnReceive函数无法从其他类获取静态ArrayList

  •  0
  • Enes  · 技术社区  · 6 年前

    这就是接受者

        public class Alarm extends BroadcastReceiver
          {
    
        @Override
        public void onReceive(Context context, Intent intent)
        {
            PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
            PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "");
    
            wl.acquire();
    
     NotificationClass.createNotification("Total Item In List is :"+Globals.productList.size(),context);
            wl.release();
        }
    
        public void setAlarm(Context context) {
            Log.i("ALARM", "Alarm has been set it");
            AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
            Intent i = new Intent(context, Alarm.class);
            PendingIntent pi = PendingIntent.getBroadcast(context, 0, i, 0);
            am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 1000 * 1 * 1, pi); 
    
        }
    
        public void cancelAlarm(Context context)
        {
            Log.i("ALARM","Alarm has been Cancel");
            Intent intent = new Intent(context, Alarm.class);
            PendingIntent sender = PendingIntent.getBroadcast(context, 0, intent, 0);
            AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
            alarmManager.cancel(sender);
        }
    

    这是国际班

    public class Globals  {
      public static List <ProductClass> productList=new ArrayList<ProductClass>();
    public static String testArray[]={"test1","test2","test3"};
    }
    

    应用程序没有崩溃,但onReceive函数globals.productList.size返回0,我可以从testerray获取数据。 productList数组列表也是静态的,我可以从globals.productList中获取除onReceiuve函数之外的所有活动的数据。

    那么,如何从全局静态数组列表中获取数据呢?

    主活动类

     @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
                GetDataClass.getAllData();
      List <ProductList> pList=new ArrayList<ProductList>();
                    pList=GetDataClass.data;
            for(int i=0;i<GetDataClass.data.size();i++)
            {
    
                ProductList temp=new ProductList();
    
                temp.set(pList.get(i).pName,pList.get(i).stock,
                        pList.get(i).provider,pList.get(i).jk,pList.get(i).starCounter);
    
                Globals.productList.add(temp);
            }
            Log.i("Count", String.valueOf(Globals.productList.size()));//Return Correct number.
    
       Alarm alarm=new Alarm();
        alarm.setAlarm(getApplicationContext());
    }
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   Pierre Ghaly    6 年前

    我相信你需要调试这个并观察你的 productList .

    从没有代码其余部分的第一眼开始,我相信在程序启动时,您将列表初始化为一个新列表,该列表将创建一个大小为0的空列表。 (正在退还给您) 所以这对我来说很正常。

    这个 BroadcastReceiver 应按如下方式调用,但不创建其对象:

    Intent intent = new Intent(getApplicationContext(), Alarm.class);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(appContext, alarmRequestCode, intent, PendingIntent.FLAG_UPDATE_CURRENT);
    alarmManager.set(AlarmManager.RTC_WAKEUP, calendarTime, pendingIntent);
    

    检查 广播接收机 有关详细信息的文档。

    **请注意,将数据保存到静态列表并不意味着它们将在程序关闭后留在那里,并且 广播接收机 可能是在应用程序不运行时运行的,这就是为什么您可以检索应用程序中而不是此类中的数据。也许您需要将数据保存在数据库中或其他可以访问的地方,我相信您的问题不在检索数据的方式上。 (再说一次,多一点代码可以帮助我更好地帮助你)