Android 更新活动/在活动打开时接收广播时触发事件

Android 更新活动/在活动打开时接收广播时触发事件,android,android-notifications,Android,Android Notifications,我制作了一个广播接收器,当从服务器接收到消息时会发出通知。 当我点击通知时,它会打开预期的活动,并更新消息列表 我的问题是,在活动打开时收到广播时,如何更新消息列表(触发事件)?(就像他们在“WhatsApp”中所做的那样,他们在聊天时不发送通知,而是更新消息列表) 我的广播接收器如下: public class NotifReceiver extends BroadcastReceiver { private Context context; private String no

我制作了一个广播接收器,当从服务器接收到消息时会发出通知。 当我点击通知时,它会打开预期的活动,并更新消息列表

我的问题是,在活动打开时收到广播时,如何更新消息列表(触发事件)?(就像他们在“WhatsApp”中所做的那样,他们在聊天时不发送通知,而是更新消息列表)

我的广播接收器如下:

public class NotifReceiver extends BroadcastReceiver {
    private Context context;
    private String notifTitle,notifStatus;
    public static int NOTIF_ID = 54321;

    @Override
    public void onReceive(Context context, Intent intent) {
        this.context = context;

         if (intent.getAction().equals("android.intent.action.BOOT_COMPLETED")) {
            context.startService(new Intent(context, NotifService.class));
            Log.i("Aditya", "Background Service of SamajApp Started");
         }
        if(intent.getAction().equals("Aditya.Notification")){
            showNotif();
        }
    }

    public void showNotif(){
        NotificationManager notifManager = NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE);

        Intent i = new Intent(context, MainActivity.class);
        i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        PendingIntent pIntent = PendingIntent.getActivity(context, 0, i, 0);

        Uri soundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);

        NotificationCompat.Builder notif = new NotificationCompat.Builder(context);
        notif.setContentTitle("SamajApp");
        notif.setContentText(notifTitle);
        notif.setSmallIcon(R.drawable.logo);
        notif.setSound(soundUri);
        notif.setContentIntent(pIntent);
        notifManager.notify(NOTIF_ID, notif.build());
    }
}
 public class MainActivity extends Activity {
       private ListView mListView;

       @Override
        protected void onCreate(Bundle savedInstanceState) {
           super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main); 
             mListView = (ListView) findViewById(R.id.listViewHome);

             updateList();

        }

        //MsgListAdapter is my custom Adapter to populate Listview,
        private void updateList(){
        registerForContextMenu(mListView);
        Vector<HashMap<String, String>> list = getMsgListfromDB();  //gets message list from database
        Vector<HashMap<String, byte[]>> blobList = getBlobListfromDB();  //gets blob list from db.
        ad = new MsgListAdapter(getApplicationContext(), list,blobList,R.layout.listrow,
                new String[] { "MsgCat", "MsgDt_Simp","by","FlagUnread"},
                new int[] {R.id.textViewCat, R.id.textViewDateTime,R.id.textViewBy},
                new int[] {R.id.imageViewMsgImg,R.id.imageViewCatImg},R.id.imageViewUnreaddr);
        mListView.setAdapter(ad);
            }
       }
我已经在舱单上登记了它,它工作得很好

我的主要活动如下:

public class NotifReceiver extends BroadcastReceiver {
    private Context context;
    private String notifTitle,notifStatus;
    public static int NOTIF_ID = 54321;

    @Override
    public void onReceive(Context context, Intent intent) {
        this.context = context;

         if (intent.getAction().equals("android.intent.action.BOOT_COMPLETED")) {
            context.startService(new Intent(context, NotifService.class));
            Log.i("Aditya", "Background Service of SamajApp Started");
         }
        if(intent.getAction().equals("Aditya.Notification")){
            showNotif();
        }
    }

    public void showNotif(){
        NotificationManager notifManager = NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE);

        Intent i = new Intent(context, MainActivity.class);
        i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        PendingIntent pIntent = PendingIntent.getActivity(context, 0, i, 0);

        Uri soundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);

        NotificationCompat.Builder notif = new NotificationCompat.Builder(context);
        notif.setContentTitle("SamajApp");
        notif.setContentText(notifTitle);
        notif.setSmallIcon(R.drawable.logo);
        notif.setSound(soundUri);
        notif.setContentIntent(pIntent);
        notifManager.notify(NOTIF_ID, notif.build());
    }
}
 public class MainActivity extends Activity {
       private ListView mListView;

       @Override
        protected void onCreate(Bundle savedInstanceState) {
           super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main); 
             mListView = (ListView) findViewById(R.id.listViewHome);

             updateList();

        }

        //MsgListAdapter is my custom Adapter to populate Listview,
        private void updateList(){
        registerForContextMenu(mListView);
        Vector<HashMap<String, String>> list = getMsgListfromDB();  //gets message list from database
        Vector<HashMap<String, byte[]>> blobList = getBlobListfromDB();  //gets blob list from db.
        ad = new MsgListAdapter(getApplicationContext(), list,blobList,R.layout.listrow,
                new String[] { "MsgCat", "MsgDt_Simp","by","FlagUnread"},
                new int[] {R.id.textViewCat, R.id.textViewDateTime,R.id.textViewBy},
                new int[] {R.id.imageViewMsgImg,R.id.imageViewCatImg},R.id.imageViewUnreaddr);
        mListView.setAdapter(ad);
            }
       }
公共类MainActivity扩展活动{
私有列表视图;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mListView=(ListView)findViewById(R.id.listViewHome);
updateList();
}
//MsgListAdapter是我用来填充Listview的自定义适配器,
私有void updateList(){
registerForContextMenu(mListView);
Vector list=getMsgListfromDB();//从数据库获取消息列表
Vector blobList=getBlobListfromDB();//从db获取blob列表。
ad=新的MsgListAdapter(getApplicationContext(),list,blobList,R.layout.listrow,
新字符串[]{“MsgCat”、“MsgDt_Simp”、“by”、“flaguread”},
新int[]{R.id.textViewCat,R.id.textViewDateTime,R.id.textViewBy},
新的int[]{R.id.imageViewMsgImg,R.id.imageViewCatImg},R.id.imageviewunaddr);
mListView.setAdapter(ad);
}
}
任何有关这方面的帮助都将不胜感激。 谢谢。

两种方式

  • 或者在您的活动中有一个静态处理程序declaration,并使用相同的方法将消息发回活动,如果活动,则更新您需要的任何内容
  • 比如:

  • 将广播接收器声明为Activity类中的静态子类,这样一旦接收到后续广播,就可以轻松地更新UI
  • 比如:


    在我看来,第二种方法更容易使用。

    你能像第一种方法一样描述第二种方法吗?在这里,你添加了一个示例,检查一下,如果需要更多帮助,请告诉我。你刚刚在MainActivity中对BroadCastreceiver类进行了子类化,以便它可以与UI进行调整。它肯定会工作,但在我的情况下,我做了一个单独的类扩展广播接收器。我如何在MainActivity的UI中进行更改。好的,谢谢你的回答。两种方式,要么有两个接收者,要么有多个接收者,一个活动被另一个覆盖。