我正在关注this教程,以便在 Android设备上显示通知。当我在设备上运行应用程序时,状态栏上会出现一个图标(通常它出现在Android设备上),这绝对是完美的。但出于好奇,我想知道当设备收到通知时,我可以显示警报或某些视图,其中包含一些细节吗?我想在我的下一个应用程序中实现这个概念 一些样本会对我有很大帮助。
答案 0 :(得分:0)
一种典型的模式是您注册应用程序的某个部分以“接收”或监听特定意图。这样,您的应用程序可以在任意时间点唤醒,查看调用意图,并决定如何处理它(无论是启动完整应用程序,显示对话框还是其他内容)。与此相关的一件好事是使用AlarmManager来设置将在以后触发和唤醒您的应用程序的警报(定期更新)。
这是否回答了你的问题?我已经在我的应用程序中做了类似的事情,如果你愿意,我可以帮你解决代码。
EDIT 为了实现这一点,您将创建一个扩展BroadcastReceiver或IntentService的java类(取决于您是希望该类分别在ui线程上运行还是作为服务运行)。在下面的示例中,我已经定义了自己的意图操作键,但通常您会使用intent.getAction()检查操作:
public class QueryService extends IntentService {
public final static String SERVICE_NAME = "QueryService";
// incoming flags
public final static String FLAG_ACTION = "R_ACTION";
public final static String FLAG_EVENTS_RETURNED = "R_EVENTS";
public final static String FLAG_EVENTS_ARCHIVED_RETURNED = "R_EVENTS_ARCH";
public final static String FLAG_SHARED_PREFERNCES_RETURNED = "R_PREFS";
// outgoing flags
public final static String RETURN_EVENTS = "RETURN_E";
public final static String RETURN_EVENTS_ARCHIVED = "RETURN_E_A";
public final static String RETURN_SHARED_PREFS = "RETURN_S_P";
public QueryService() {
super(SERVICE_NAME);
}
protected void onHandleIntent(Intent intent) {
String rAction = intent.getStringExtra(FLAG_ACTION);
boolean rEvents = intent.getBooleanExtra(FLAG_EVENTS_RETURNED, true);
boolean rEventsArchived = intent.getBooleanExtra(FLAG_EVENTS_ARCHIVED_RETURNED, true);
boolean rSharedPrefs = intent.getBooleanExtra(FLAG_SHARED_PREFERNCES_RETURNED, true);
if(rAction == null){
Log.e(SERVICE_NAME, "no return action specified, exiting...");
return;
}
Log.i(SERVICE_NAME, "Caller: " + rAction);
DroidTaskApplication app = (DroidTaskApplication)getApplicationContext();
Intent resultsIntent = new Intent(rAction);
// TODO assembling events / archived events from a database needs
// a function that gets the complete event instead of just its headers
// assemble event objects and insert them
if(rEvents){
List<Event> liteEvents = app.edo.getAllEvents();
if(liteEvents != null){
for(Event e : liteEvents){
int id = e.getId();
e.setAlarms(app.edo.getAlarmsById(id));
e.setSubtasks(app.edo.getSubtasksById(id));
e.setNotes(app.edo.getNotesById(id));
}
}
resultsIntent.putExtra(RETURN_EVENTS, (Serializable)liteEvents);
}
// assemble archived event objects and insert
if(rEventsArchived){
List<Event> liteEventsA = app.edo.getAllArchivedEvents();
resultsIntent.putExtra(RETURN_EVENTS_ARCHIVED, (Serializable)liteEventsA);
}
// collect the shared data and send it
if(rSharedPrefs){
SharedPreferences prefs = getSharedPreferences(getString(R.string.PREFS_FILE_NAME), MODE_WORLD_READABLE);
resultsIntent.putExtra(RETURN_SHARED_PREFS, (Serializable)(prefs == null? null : prefs.getAll()));
}
Log.i(SERVICE_NAME, "returning results");
// send everything to the caller
sendBroadcast(resultsIntent);
}
}
无论该类是服务还是广播接收者,您都必须将其作为“接收者”注册到应用程序(意味着它可以接受某种类型的意图广播);这可以在Java代码或Android清单中完成。我在清单中用于该服务的示例如下(尽管我的Java类并不关心,关于意图动作还是):
<!-- Notification Launcher -->
<receiver android:name="edu.clarkson.dtask.BK.NotificationReceiver" android:enabled="true">
<intent-filter>
<action android:name="edu.clarkson.dtask.BK.NotificationReceiver.DISPATCH_ALARM" />
<action android:name="edu.clarkson.dtask.BK.NotificationReceiver.CANCEL_ALARM" />
</intent-filter>
</receiver>
当某个状态发生变化时,操作系统将广播不同的系统操作和通知;如果您想了解这些更改,请在清单中以与上述相同的方式注册广播接收者或intentservice,以获取不同的Intent操作(例如ACTION_BATTERY_STATE_CHANGED)。所有文档都可以在android dev site上找到。我希望这能让你开始走上正确的道路。