2017-01-02 93 views
1

我有一个后台服务正在运行,并且有一个通知监听器。我想从后台服务调用通知侦听器,它似乎不工作。我有我的课下面。 1.主要活动启动服务 2.MyService是运行 3 NLService是通知监听服务,我想将里面的MyService调用在android studio中调用背景服务中的通知监听器

MainActivity.java

package com.example.notifyservice; 

import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.content.IntentFilter; 
import android.os.Bundle; 
import android.support.v4.content.LocalBroadcastManager; 
import android.support.v7.app.AppCompatActivity; 
import android.view.View; 
import android.widget.TextView; 
import android.widget.Toast; 

import com.example.eg.intentserviceexample.R; 

public class MainActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     //setting button click 
     findViewById(R.id.btn_start_service).setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       //Creating an intent for sending to service 
       Intent intent = new Intent(getApplicationContext(), MyService.class); 

       intent.putExtra("id", 101); 
       intent.putExtra("msg", "hi"); 

       //starting service 
       startService(intent); 
      } 
     }); 
    } 

    @Override 
    protected void onStart() { 
     super.onStart(); 

     //register broadcast receiver for the intent MyTaskStatus 
     LocalBroadcastManager.getInstance(this).registerReceiver(MyReceiver, new IntentFilter("MyServiceStatus")); 
    } 


    //Defining broadcast receiver 
    private BroadcastReceiver MyReceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 

      String message = intent.getStringExtra("serviceMessage"); 

      Toast.makeText(MainActivity.this, "Received : " + message, Toast.LENGTH_SHORT).show(); 
     } 
    }; 




    @Override 
    protected void onStop() { 
     super.onStop(); 

     LocalBroadcastManager.getInstance(this).unregisterReceiver(MyReceiver); 
    } 

} 

MyService.java后台服务

package com.example.notifyservice; 

import android.app.IntentService; 
import android.content.BroadcastReceiver; 
     import android.content.Context; 
     import android.content.Intent; 
     import android.support.v4.content.LocalBroadcastManager; 
     import android.util.Log; 
     import android.widget.TextView; 

public class MyService extends IntentService { 
    private TextView txtView; 
    private NotificationReceiver nReceiver; 
    public MyService() { 
     super(MyService.class.getName()); 
    } 

    @Override 
    protected void onHandleIntent(Intent intent) { 


     //retrieving data from the received intent 
     int id = intent.getIntExtra("id",0); 
     String message = intent.getStringExtra("msg"); 

     Log.i("Data ", "id : "+id+" message : "+ message); 
     //----------------------------------------------- 


     //Do your long running task here 

     Intent i = new Intent("com.example.notifyservice.NOTIFICATION_LISTENER_SERVICE_EXAMPLE"); 

     i.putExtra("command","list"); 
     sendBroadcast(i); 
     //------------------------------------------------ 

     /* //Broadcasting some data 
     Intent myIntent = new Intent("MyServiceStatus"); 
     myIntent.putExtra("serviceMessage", "Task done"); 


     // Send broadcast 
     LocalBroadcastManager.getInstance(this).sendBroadcast(myIntent);*/ 

    } 
    class NotificationReceiver extends BroadcastReceiver { 

     @Override 
     public void onReceive(Context context, Intent intent) { 
      String temp = intent.getStringExtra("notification_event") + "\n" + txtView.getText(); 
      txtView.setText(temp); 
     } 
    } 
} 

NLService.java

package com.example.notifyservice; 

import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.content.IntentFilter; 
import android.os.Build; 
import android.os.Bundle; 
import android.service.notification.NotificationListenerService; 
import android.service.notification.StatusBarNotification; 
import android.support.annotation.RequiresApi; 
import android.util.Log; 

@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) 
public class NLService extends NotificationListenerService { 

    private String TAG = this.getClass().getSimpleName(); 
    private NLServiceReceiver nlservicereciver; 
    @Override 
    public void onCreate() { 
     super.onCreate(); 
     nlservicereciver = new NLServiceReceiver(); 
     IntentFilter filter = new IntentFilter(); 
     filter.addAction("com.example.notify.NOTIFICATION_LISTENER_SERVICE_EXAMPLE"); 
     registerReceiver(nlservicereciver,filter); 
    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     unregisterReceiver(nlservicereciver); 
    } 

    @Override 
    public void onNotificationPosted(StatusBarNotification sbn) { 

     String pack = sbn.getPackageName(); 

     String text = ""; 
     String title = ""; 
     if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) { 
      Bundle extras = sbn.getNotification().extras; 
      text = extras.getCharSequence("android.text").toString(); 
      title = extras.getString("android.title"); 
     } 

     Log.i("Package",pack); 
     Log.i("Title",title); 
     Log.i("Text",text); 

    } 

    @Override 
    public void onNotificationRemoved(StatusBarNotification sbn) { 
     Log.i(TAG,"********** onNOtificationRemoved"); 
     Log.i(TAG,"ID :" + sbn.getId() + "t" + sbn.getNotification().tickerText +"\t" + sbn.getPackageName()); 
     Intent i = new Intent("com.example.notify.NOTIFICATION_LISTENER_EXAMPLE"); 
     i.putExtra("notification_event","onNotificationRemoved :" + sbn.getPackageName() + "\n"); 

     sendBroadcast(i); 
    } 

    class NLServiceReceiver extends BroadcastReceiver{ 

     @Override 
     public void onReceive(Context context, Intent intent) { 

      if(intent.getStringExtra("command").equals("list")){ 
       Intent i1 = new Intent("com.example.notify.NOTIFICATION_LISTENER_EXAMPLE"); 
       i1.putExtra("notification_event","====================="); 
       sendBroadcast(i1); 
       int i=1; 
       for (StatusBarNotification sbn : NLService.this.getActiveNotifications()) { 
        Intent i2 = new Intent("com.example.notify.NOTIFICATION_LISTENER_EXAMPLE"); 
        i2.putExtra("notification_event",i +" " + sbn.getPackageName() + "\n"); 
        sendBroadcast(i2); 
        i++; 
       } 
       Intent i3 = new Intent("com.example.notify.NOTIFICATION_LISTENER_EXAMPLE"); 
       i3.putExtra("notification_event","===== Notification List ===="); 
       sendBroadcast(i3); 

      } 

     } 
    } 

} 

bacgkround服务启动但不会看到NLS服务。 任何帮助将不胜感激!

编辑清单太:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.example.eg.intentserviceexample"> 
    <uses-sdk android:minSdkVersion="18" 
     android:targetSdkVersion="18" 
     /> 
    <application 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:supportsRtl="true" 
     android:theme="@style/AppTheme"> 
     <activity android:name="com.example.notifyservice.MainActivity"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 


     <service 
      android:name="com.example.notifyservice.MyService" 
      android:exported="false"/> 

     <service android:name="com.example.notifyservice.NLService" 
      android:label="@string/app_name" 
      android:permission="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE"> 
      <intent-filter> 
       <action android:name="android.service.notification.NotificationListenerService" /> 
      </intent-filter> 
     </service> 

    </application> 

</manifest> 

回答

0

所以我做错了什么是我试图创建2个服务。相反,我只需要一个。 这是可用的代码。它只是启动bacgrkound服务并计算通知。当您单击报告时,它会显示所有通知,即使用户已关闭应用程序。我在5次通知后添加了额外的代码以进行通知。

MainActivity.java 
package com.example.notifyservice; 

import android.app.NotificationManager; 
import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.content.IntentFilter; 
import android.support.v4.app.NotificationCompat; 
import android.support.v4.content.LocalBroadcastManager; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.widget.Toast; 

import java.util.Timer; 
import java.util.TimerTask; 


public class MainActivity extends AppCompatActivity { 

/* 
    protected final Timer myTimer = new Timer("MainActivityTimer", false); 
*/ 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     // FIRST OF ALL 
     // START SERVICE AS STICKY - BY EXPLICIT INTENT 
     // to prevent being started by the system (without the sticky flag) 
     Intent intent = new Intent(getApplicationContext(), NLService.class); 

     // TODO: to be removed 
     intent.putExtra("id", 101); 
     intent.putExtra("msg", "hi"); 

     //starting service 


     startService(intent); 


     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     Intent i = new Intent("android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS"); 
     startActivity(i); 
     //setting button click 
     findViewById(R.id.btn_start_service).setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       // Ask service (async) for its status (manually after the main activity was paused or closed and missed some NLService's broadcasts) 
       // the background service is sticky and the counters(added/removed) are not reset. 

       //Creating an intent for sending to service 
       //Intent intent = new Intent(getApplicationContext(), MyService.class); 
       Intent intent = new Intent(getApplicationContext(), NLService.class); 
       intent.putExtra("command", "get_status"); 
       //starting service 
       startService(intent); 

      } 
     }); 
    } 

    @Override 
    protected void onStart() { 
     super.onStart(); 

     // register broadcast receiver for the intent MyTaskStatus 
     LocalBroadcastManager.getInstance(this).registerReceiver(MyReceiver, new IntentFilter(NLService.ACTION_STATUS_BROADCAST)); 


    } 


    //Defining broadcast receiver 
    private BroadcastReceiver MyReceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      Log.i("MainActivity", "Broadcast Recieved: "+intent.getStringExtra("serviceMessage")); 
      String message = intent.getStringExtra("serviceMessage"); 
      Toast.makeText(MainActivity.this, message, Toast.LENGTH_SHORT).show(); 
     } 
    }; 




    @Override 
    protected void onStop() { 
     super.onStop(); 

     LocalBroadcastManager.getInstance(this).unregisterReceiver(MyReceiver); 
    } 

} 

NLService.java

package com.example.notifyservice; 

import android.app.IntentService; 
import android.app.NotificationManager; 
import android.content.BroadcastReceiver; 
import android.content.ComponentName; 
import android.content.Context; 
import android.content.Intent; 
import android.content.IntentFilter; 
import android.os.Build; 
import android.service.notification.NotificationListenerService; 
import android.service.notification.StatusBarNotification; 
import android.support.annotation.RequiresApi; 
import android.support.v4.app.NotificationCompat; 
import android.support.v4.content.LocalBroadcastManager; 
import android.util.Log; 

// @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) 
@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) 
public class NLService extends NotificationListenerService { 

    public static final String ACTION_STATUS_BROADCAST = "com.example.notifyservice.NLService_Status"; 

    private String TAG = this.getClass().getSimpleName(); 
    private NLServiceReceiver nlservicereciver; 

    /** 
    * The number of notifications added (since the service started) 
    */ 
    private int nAdded=0; 
    /** 
    * The number of notifications removed (since the service started) 
    */ 
    private int nRemoved=0; 
    int temp = 5; 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     //retrieving data from the received intent 
     if(intent.hasExtra("command")) { 
      Log.i("NLService", "Started for command '"+intent.getStringExtra("command")); 
      broadcastStatus(); 
     } else if(intent.hasExtra("id")) { 
      int id = intent.getIntExtra("id", 0); 
      String message = intent.getStringExtra("msg"); 
      Log.i("NLService", "Requested to start explicitly - id : " + id + " message : " + message); 
     } 
     super.onStartCommand(intent, flags, startId); 

     // NOTE: We return STICKY to prevent the automatic service termination 
     return START_STICKY; 
    } 

    private void broadcastStatus() { 
     Log.i("NLService", "Broadcasting status added("+nAdded+")/removed("+nRemoved+")"); 
     Intent i1 = new Intent(ACTION_STATUS_BROADCAST); 
     i1.putExtra("serviceMessage","Added: "+nAdded+" | Removed: "+nRemoved); 
     LocalBroadcastManager.getInstance(this).sendBroadcast(i1); 
     // sendBroadcast(i1); 

    } 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     Log.i("NLService", "NLService created!"); 
     nlservicereciver = new NLServiceReceiver(); 
     IntentFilter filter = new IntentFilter(); 
     filter.addAction("com.example.notifyservice.NOTIFICATION_LISTENER_SERVICE_EXAMPLE"); 
     registerReceiver(nlservicereciver,filter); 
     Log.i("NLService", "NLService created!"); 
    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     unregisterReceiver(nlservicereciver); 
     Log.i("NLService", "NLService destroyed!"); 
    } 

    /* > API 21 
    @Override 
    public void onListenerDisconnected() { 
     super.onListenerDisconnected(); 
     Log.w("NLService", "Notification listener DISCONNECTED from the notification service! Scheduling a reconnect..."); 
     // requestRebind(new ComponentName(this.getPackageName(), this.getClass().getCanonicalName())); 
    } 

    @Override 
    public void onListenerConnected() { 
     super.onListenerConnected(); 
     Log.w("NLService", "Notification listener connected with the notification service!"); 
    } 
    */ 

    @Override 
    public void onNotificationPosted(StatusBarNotification sbn) { 

     Log.i(TAG,"********** onNotificationPosted"); 
     Log.i(TAG,"ID :" + sbn.getId() + "t" + sbn.getNotification().tickerText + "\t" + sbn.getPackageName()); 
     Intent i = new Intent("com.example.notify.NOTIFICATION_LISTENER_EXAMPLE"); 
     i.putExtra("notification_event","onNotificationPosted :" + sbn.getPackageName() + "\n"); 
     sendBroadcast(i); 

     nAdded++; 

     if (nAdded == temp) { 
      System.out.println("reached" + temp); 
      temp = temp + 5; 
      System.out.println(temp); 
      NotificationManager nManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); 
      NotificationCompat.Builder ncomp = new NotificationCompat.Builder(this); 
      ncomp.setContentTitle("Notification"); 
      ncomp.setContentText("Notification Listener Service Example"); 
      ncomp.setTicker("Notification Listener Service Example"); 
      ncomp.setSmallIcon(R.mipmap.ic_launcher); 
      ncomp.setAutoCancel(true); 
      nManager.notify((int)System.currentTimeMillis(),ncomp.build()); 
     } 
     broadcastStatus(); 
    } 

    @Override 
    public void onNotificationRemoved(StatusBarNotification sbn) { 
     Log.i(TAG,"********** onNOtificationRemoved"); 
     Log.i(TAG,"ID :" + sbn.getId() + "t" + sbn.getNotification().tickerText +"\t" + sbn.getPackageName()); 
     Intent i = new Intent("com.example.notify.NOTIFICATION_LISTENER_EXAMPLE"); 
     i.putExtra("notification_event","onNotificationRemoved :" + sbn.getPackageName() + "\n"); 

     sendBroadcast(i); 

     nRemoved++; 
     broadcastStatus(); 
    } 

    class NLServiceReceiver extends BroadcastReceiver { 

     @Override 
     public void onReceive(Context context, Intent intent) { 

      if(intent.getStringExtra("command").equals("list")){ 
       Intent i1 = new Intent("com.example.notify.NOTIFICATION_LISTENER_EXAMPLE"); 
       i1.putExtra("notification_event","====================="); 
       sendBroadcast(i1); 
       int i=1; 
       for (StatusBarNotification sbn : NLService.this.getActiveNotifications()) { 
        Intent i2 = new Intent("com.example.notify.NOTIFICATION_LISTENER_EXAMPLE"); 
        i2.putExtra("notification_event",i +" " + sbn.getPackageName() + "\n"); 
        sendBroadcast(i2); 
        i++; 
       } 
       Intent i3 = new Intent("com.example.notify.NOTIFICATION_LISTENER_EXAMPLE"); 
       i3.putExtra("notification_event","===== Notification List ===="); 
       sendBroadcast(i3); 

      } 

     } 
    } 

} 
0

你有没有在你的清单中定义的服务。对于通知服务,您还需要写入权限。

 <service 
      android:name=".MyService" 
      android:enabled="true"/> 

     <service android:name=".NLService" 
       android:label="@string/app_name" 
       android:permission="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE"> 
      <intent-filter> 
       <action android:name="android.service.notification.NotificationListenerService" /> 
      </intent-filter> 
     </service> 

,如果你想显示你还需要编写代码这种情况下通知:

NotificationManager nManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); 
      NotificationCompat.Builder ncomp = new NotificationCompat.Builder(this); 
      ncomp.setContentTitle("My Notification"); 
      ncomp.setContentText("Notification Listener Service Example"); 
      ncomp.setTicker("Notification Listener Service Example"); 
      ncomp.setSmallIcon(R.mipmap.ic_launcher); 
      ncomp.setAutoCancel(true); 
      nManager.notify((int)System.currentTimeMillis(),ncomp.build()); 

还是你提供给您的应用程序通知访问?转到您的设置,并检查提供或不提供的应用程序的通知访问?

enter image description here

+0

是的,我做我在后 – kyripapa

+0

其工作加在我的情况。你想显示通知吗? – Spartan

+0

我想先在屏幕上显示通知。稍后我会以某种方式存储它们。后台服务可以工作,但通知侦听器是否也适合您? – kyripapa