当设备收到GCM IntentService消息时刷新列表视图
我的应用程序能够接收来自GCM的消息,并将消息保存到手机上的SQLlite数据库中。这些消息可在具有listview的活动中查看 在下面的代码中,onPause()函数刷新listView。这不是一个好的实现,因为它仅在更新时未显示活动时才起作用。如果在更新时显示活动,则列表是静态的,不会更新 问题:当设备收到GCM IntentService消息时刷新列表视图,service,android-listview,google-cloud-messaging,Service,Android Listview,Google Cloud Messaging,我的应用程序能够接收来自GCM的消息,并将消息保存到手机上的SQLlite数据库中。这些消息可在具有listview的活动中查看 在下面的代码中,onPause()函数刷新listView。这不是一个好的实现,因为它仅在更新时未显示活动时才起作用。如果在更新时显示活动,则列表是静态的,不会更新 问题: 如何在显示活动时更新listview?或者,是否有一种方法可以使用后台服务更新适配器,以便在显示活动时始终显示最新数据 这种功能目前在安卓系统中是不可能实现的吗?我还需要实现一些其他功能,比如“拉
public类NotesView扩展活动实现了mclicklinklistener{
列表视图列表视图;
注释适配器objAdapter;
NotificationsDatabase db=新的NotificationsDatabase(本);
列表警报;
弦乐;
串时间;
text视图noteView;
文本视图时间视图;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.note);
listView=(listView)findViewById(R.id.notelist);
setOnItemClickListener(this);
noteView=(TextView)findViewById(R.id.noteDisplay);
timeView=(TextView)findViewById(R.id.notetimeStampDisplay);
新建MyTask().execute();
}
//我的任务开始了。。。
类MyTask扩展了AsyncTask{
ProgressDialog;
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
pDialog=newprogressdialog(NotesView.this);
设置消息(“加载…”);
pDialog.setCancelable(假);
pDialog.show();
如果(isCancelled()){
这个。取消(true);
}
}
@凌驾
受保护列表doInBackground(无效…参数){
db.open();
listAlerts=db.getData();
如果(isCancelled()){
这个。取消(true);
}
返回null;
}
受保护的void onPostExecute(列出警报){
if(null!=pDialog&&pDialog.isShowing()){
pDialog.disclose();
}
db.close();
setAdapterToListview();
}
}//结束我的任务
public void setAdapterToListview(){
objAdapter=newnoteadapter(NotesView.this、R.layout.row\u notes、listAlerts);
objAdapter.sortByNoteDesc();
notifyDataSetChanged();
setAdapter(objAdapter);
}
@凌驾
公共布尔onKeyDown(int-keyCode,KeyEvent事件){
if(keyCode==KeyEvent.keyCode\u BACK&&event.getRepeatCount()==0){
意图=新意图(
NotesView.this.getApplicationContext(),
tabbare(例如,class);
意向。额外(“goToTab”、“警报”);
星触觉(意向);
返回true;
}
返回super.onKeyDown(keyCode,event);
}
公共视图单击(AdapterView父视图、View viewDel、int position、,
长id){
对于(int i=0;i<1;i++){
Notes项=listAlerts.get(位置);
int id=item.getId();
note=item.getNote();
时间=item.getTimeStamp();
}
系统输出打印项次(备注+“”+时间);
//
}
@凌驾
受保护的void onResume(){
super.onResume();
}
@凌驾
受保护的void onPause(){
super.onPause();
setContentView(R.layout.note);
listView=(listView)findViewById(R.id.notelist);
setAdapter(空);
setOnItemClickListener(this);
noteView=(TextView)findViewById(R.id.noteDisplay);
timeView=(TextView)findViewById(R.id.notetimeStampDisplay);
新建MyTask().execute();
}
@凌驾
受保护的空onDestroy(){
}
}
来自GCMinentService的代码片段
@覆盖
受保护的void onMessage(上下文、意图){
Log.i(标记“收到的消息”);
//String message=getString(R.String.gcm_message);
System.out.println(“onMessage:”);
Bundle extras=intent.getExtras();
字符串消息=extras.getString(“消息”);
String event_id_from_server=extras.getString(“server_id”);
//显示消息(上下文、消息);
生成化(上下文、消息);
saveMsg(消息);
System.out.println(“服务器id为”+来自服务器的事件id);
if(来自服务器的事件\u id\u!=null){
updateLocalDatabase(来自\u服务器的事件\u id\u);
}
}
公共void saveMsg(字符串msg){
布尔值=真;
试一试{
NotificationsDatabase条目=新建NotificationsDatabase(gcminentService.this);
entry.open();
java.util.Date Date=新建java.util.Date();
Timestamp x=新的时间戳(date.getTime());
字符串时间戳=x.toLocaleString();
createEntry(消息,时间戳);
entry.close();
//更新适配器服务
}捕获(例外e){
工作=假;
字符串错误=e.toString();
系统输出打印项次(错误);
}最后{
如果(工作){
}
}
}
我稍微整理了一下您的代码。基本上,所有视图分配都应该在onCreate中完成一次,而数据的加载应该在onResume()中完成。看看这是否有帮助:
@覆盖
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInst