android – 始终在通知栏中显示服务

我想将我的应用添加通知栏,以便它始终显示,如Google Play商店中的某些应用.

我想要这样的屏幕截图:

我希望我的通知不被清除,并且当我的应用程序在通知单击时被打开.

这是我的服务类代码

package com.demo;

import java.util.Random;

import android.app.Notification;
import android.app.notificationmanager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Intent;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.widget.Toast;

public class ServiceExample extends Service {

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        Toast.makeText(this,"Service Created",300).show();
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Toast.makeText(this,"Service Destroy",300).show();
    }

    @Override
    public void onLowMemory() {
        super.onLowMemory();
        Toast.makeText(this,"Service LowMemory",300).show();
    }

    @Override
    public void onStart(Intent intent,int startId) {
        super.onStart(intent,startId);
        Toast.makeText(this,"Service start",300).show();
        Notification notification = new Notification(R.drawable.ic_launcher,"Rolling text on statusbar",System.currentTimeMillis());

        PendingIntent contentIntent = PendingIntent.getActivity(this,new Intent(this,ServiceDemoActivity.class),PendingIntent.FLAG_UPDATE_CURRENT);

        notification.setLatestEventInfo(this,"Notification title","Notification description",contentIntent);

        startForeground(1,notification);
    }

    @Override
    public int onStartCommand(Intent intent,int flags,int startId) {

        Toast.makeText(this,"task perform in service",300).show();
        /*ThreadDemo td=new ThreadDemo();
        td.start();*/
        Notification notification = new Notification(R.drawable.ic_launcher,notification);

        return super.onStartCommand(intent,flags,startId);
    }

    private class ThreadDemo extends Thread{
        @Override
        public void run() {
            super.run();
            try{
            sleep(70*1000); 
            handler.sendEmptyMessage(0);
            }catch(Exception e){
                e.getMessage();
            }
        }
    }
   private Handler handler=new Handler(){
    @Override
    public void handleMessage(Message msg) {
        super.handleMessage(msg);
        showAppNotification();
    }
   };

   void showAppNotification() {
       try{
        notificationmanager nm = (notificationmanager)getSystemService(NOTIFICATION_SERVICE);
        // The PendingIntent to launch our activity if the user selects this
        // notification.  Note the use of FLAG_CANCEL_CURRENT so that,if there
        // is already an active matching pending intent,cancel it and replace
        // it with the new array of Intents.
//      PendingIntent contentIntent = PendingIntent.getActivities(this,//             "My service completed",PendingIntent.FLAG_CANCEL_CURRENT);

        // The ticker text,this uses a formatted string so our message Could be localized
        String tickerText ="djdjsdjkd";

        // construct the Notification object.
        Notification notif = new Notification(R.drawable.ic_launcher,tickerText,System.currentTimeMillis());

        // Set the info for the views that show in the notification panel.
//      notif.setLatestEventInfo(this,from,message,contentIntent);

        // We'll have this notification do the default sound,vibration,and led.
        // Note that if you want any of these behaviors,you should always have
        // a preference for the user to turn them off.
        notif.defaults = Notification.DEFAULT_ALL;

        // Note that we use R.layout.incoming_message_panel as the ID for
        // the notification.  It Could be any integer you want,but we use
        // the convention of using a resource id for a string related to
        // the notification.  It will always be a unique number within your
        // application.
        nm.notify(0,notif);
       }catch(Exception e){
           e.getMessage();
       }
    }
}

我在我的项目清单文件中声明我的服务:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.demo"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="8" />
    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <activity
            android:name=".ServiceDemoActivity"
            android:label="@string/app_name"  >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <service android:name=".ServiceExample"></service>
    </application>

</manifest>

这是我开始和停止服务的课程:

package com.demo;

import android.app.Activity;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.ReceiverCallNotAllowedException;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;

public class ServiceDemoActivity extends Activity implements OnClickListener {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        findViewById(R.id.start).setonClickListener(this);
        findViewById(R.id.stop).setonClickListener(this);
    }

    private Intent inetnt;
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.start:

            inetnt=new Intent(this,ServiceExample.class);
            startService(inetnt);
            break;
        case R.id.stop:

            inetnt=new Intent(this,ServiceExample.class);
            stopService(inetnt);
            break;
        }
    }

    @Override
    protected void onResume() {
        super.onResume();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
//      
    }
}

这是我的布局代码

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <Button
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="StartService" 
        android:id="@+id/start"/>

        <Button
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="StopService"
        android:id="@+id/stop" />

</LinearLayout>

解决方法

如果您希望应用程序始终处于状态栏中,则必须在onStart(…)和onStartCommand(…)方法中编写一个服务并调用startForeground(id,notification),并分别调用在服务的onDestroy()方法中使用stopForeground()方法.

该ID是一个整数,您可以分配给通知,通知一个通知对象(您可以在这里阅读更多:http://developer.android.com/guide/topics/ui/notifiers/notifications.html).

只要您的服务正在运行,就会显示状态栏通知.

Notification notification = new Notification(R.drawable.statusbar_icon,System.currentTimeMillis());

PendingIntent contentIntent = PendingIntent.getActivity(this,YourActivity.class),PendingIntent.FLAG_UPDATE_CURRENT);

notification.setLatestEventInfo(this,contentIntent);

startForeground(1,notification);

您可以将此代码放在服务的onStart(…)和onStartCommand(…)方法中.

此外,您可以在这里阅读更多服务:http://developer.android.com/reference/android/app/Service.html

相关文章

Android性能优化——之控件的优化 前面讲了图像的优化,接下...
前言 上一篇已经讲了如何实现textView中粗字体效果,里面主要...
最近项目重构,涉及到了数据库和文件下载,发现GreenDao这个...
WebView加载页面的两种方式 一、加载网络页面 加载网络页面,...
给APP全局设置字体主要分为两个方面来介绍 一、给原生界面设...
前言 最近UI大牛出了一版新的效果图,按照IOS的效果做的,页...