在收到通知时显示警报或视图

时间:2011-08-09 09:47:40

标签: android notifications

我正在关注this教程,以便在 Android设备上显示通知。当我在设备上运行应用程序时,状态栏上会出现一个图标(通常它出现在Android设备上),这绝对是完美的。但出于好奇,我想知道当设备收到通知时,我可以显示警报或某些视图,其中包含一些细节吗?我想在我的下一个应用程序中实现这个概念 一些样本会对我有很大帮助。

1 个答案:

答案 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上找到。我希望这能让你开始走上正确的道路。