在Android中实现startForeground方法

时间:2010-09-10 18:18:39

标签: android

我想在startForeground()类中实现Service方法,以防止服务自杀。

有人可以给我发送实现此方法的代码吗?

4 个答案:

答案 0 :(得分:28)

Jovan,这是一个为2.0+和1.6-制作兼容代码的方法(代码显示了如何检测哪一个兼容) http://android-developers.blogspot.com/2010/02/service-api-changes-starting-with.html

对于2.0+,我将一些示例代码放在一起(使用startForeground)。观察一些代码现在已被弃用,但是,Notification.Builder使用API​​级别11(3.x),这意味着在大多数手机使用兼容的Android版本之前我不会使用它。由于绝大多数手机现在都运行2.x版本,我认为跳过兼容性检查是安全的。

final static int myID = 1234;

//The intent to launch when the user clicks the expanded notification
Intent intent = new Intent(this, SomeActivityToLaunch.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
PendingIntent pendIntent = PendingIntent.getActivity(this, 0, intent, 0);

//This constructor is deprecated. Use Notification.Builder instead
Notification notice = new Notification(R.drawable.icon_image, "Ticker text", System.currentTimeMillis());

//This method is deprecated. Use Notification.Builder instead.
notice.setLatestEventInfo(this, "Title text", "Content text", pendIntent);

notice.flags |= Notification.FLAG_NO_CLEAR;
startForeground(myID, notice);

将此代码放在您服务的onStartCommand()内,您就可以了。 (但您可以将此部分代码放在服务的任何位置。)

P.S。停止服务进入前台只需在服务中的任何位置使用stopForeground(true);

答案 1 :(得分:7)

通过将Android支持库添加到项目中,此代码将使用适用于任何API的最佳选项。在Eclipse中,您可以右键单击该项目,转到Android Tools,然后单击“添加支持库...”选项以下载并添加它。

final static int myID = 1234;

//The intent to launch when the user clicks the expanded notification
Intent intent = new Intent(this, SomeActivityToLaunch.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
PendingIntent pendIntent = PendingIntent.getActivity(this, 0, intent, 0);

if (Integer.parseInt(Build.VERSION.SDK) >= Build.VERSION_CODES.DONUT) {
// Build.VERSION.SDK_INT requires API 4 and would cause issues below API 4

    NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
    builder.setTicker("TICKER").setContentTitle("TITLE").setContentText("CONTENT")
            .setWhen(System.currentTimeMillis()).setAutoCancel(false)
            .setOngoing(true).setPriority(Notification.PRIORITY_HIGH)
            .setContentIntent(pendIntent);
    Notification notification = builder.build();

} else {

    Notification notice = new Notification(R.drawable.icon_image, "Ticker text", System.currentTimeMillis());
    notice.setLatestEventInfo(this, "Title text", "Content text", pendIntent);

}
notification.flags |= Notification.FLAG_NO_CLEAR;
startForeground(myID, notification);

将代码放入您用于服务的start方法中,然后当您希望前台进程停止时,在服务中的任何位置调用stopForeground(true);

答案 2 :(得分:1)

答案 3 :(得分:0)

我不确定这是否是您要找的,但您只需创建一个通知对象(下面为mOngoingNote)并使用通知ID调用startForeground与实际通知。

    startForeground(NOTEMAN_ID, mOngoingNote);