I have a background service running and a notification listener. I want to call the notification listener from the background service and it does not seem to work. I have below my classes. 1. Main activity starts the service 2.MyService is the background service running 3. NLService is the notification listeners service I want to call inside the MyService
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);
}
}
}
}
The bacgkround service starts but does not see the NLSErvice. Any help will be much appreciated!
Edit the manifest too:
<?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>
So what I did wrong is that I tried to create 2 services. Instead I only needed one. Here is the code that works. What it simply does is starting the bacgrkound service and counts the notifications.When you click report it shows all the notifications, even if the user has close the app. I have put extra code for making a notification after 5 notifications.
NLService.java
Did you defined your services in your manifest. For notification service you need to write permission also.
if you want to show notification in that case you need to write this code also:
or did you provide the notification access to your app? Go to your settings and check notification access to your app provided or not?