Leállíthatatlan notificationlistener folyamat androidon

Leállíthatatlan notificationlistener folyamat androidon
2015-05-01T21:12:43+02:00
2015-05-02T19:56:10+02:00
2022-12-02T11:30:42+01:00
Agoston99
Üdv!
Van egy alkalmazásom androidra, aminek az lenne majd a feladata, hogy bluetoothon elküldje egy arduino-nak az értesítéseket (még csak a logcat-en küldöm). Szinte minden működik, kivéve a háttérfolyamat leállítását. Hiába nyomom meg az arra szolgáló gombot, nem történik semmi.
Itt van a MainActivity.java:

package com.goston.arduwatch; import android.content.Intent; import android.os.Bundle; import android.bluetooth.BluetoothAdapter; import android.support.v7.app.ActionBarActivity; import android.view.View; import android.widget.Button; import com.goston.arduwatch.NotificationListener; public class MainActivity extends ActionBarActivity { private static final int REQUEST_ENABLE_BT = 1; private BluetoothAdapter btAdapter = null; Intent startServiceIntent; Button button1 ; Button button2 ; Button button3 ; Button button4 ; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btAdapter = BluetoothAdapter.getDefaultAdapter(); checkBTState(); } @Override protected void onStart() { super.onStart(); setContentView(R.layout.activity_main); startServiceIntent = new Intent(getApplicationContext(), NotificationListener.class); startNotificationListener(); button1 = (Button) findViewById(R.id.button1); button2 = (Button) findViewById(R.id.button2); button3 = (Button) findViewById(R.id.button3); button4 = (Button) findViewById(R.id.button4); button1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { onEnableBluetooth(); } }); button2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { } }); button3.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { stopNotificationListener(); } }); button4.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { startNotificationListener(); } }); } private void onEnableBluetooth(){ if (btAdapter.isEnabled()) { } else { //Prompt user to turn on Bluetooth Intent enableBtIntent = new Intent(btAdapter.ACTION_REQUEST_ENABLE); startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT); } } private void stopNotificationListener(){ stopService(startServiceIntent); } private void startNotificationListener(){ startService(startServiceIntent); } private void checkBTState() { // Check for Bluetooth support and then check to make sure it is turned on // Emulator doesn't support Bluetooth and will return null if(btAdapter==null) { } else { if (btAdapter.isEnabled()) { } else { //Prompt user to turn on Bluetooth Intent enableBtIntent = new Intent(btAdapter.ACTION_REQUEST_ENABLE); startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT); } } } @Override protected void onDestroy() { super.onDestroy(); } }
És itt van a NotificationListener.java:

package com.goston.arduwatch; import android.app.NotificationManager; import android.app.PendingIntent; import android.app.TaskStackBuilder; import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.service.notification.NotificationListenerService; import android.service.notification.StatusBarNotification; import android.support.v4.app.NotificationCompat; import android.util.Log; /** * Created by Ágoston on 2015.04.30.. */ public class NotificationListener extends NotificationListenerService { static NotificationManager mNotificationManager; public void onCreate () { showNotification(); } @Override public void onNotificationPosted(StatusBarNotification sbn) { //---show current notification--- Log.i("","---Current Notification---"); Log.i("", "ID :" + sbn.getId() + "\t" + sbn.getNotification().tickerText + "\t" + sbn.getPackageName()); Log.i("","--------------------------"); //---show all active notifications--- Log.i("","===All Notifications==="); for (StatusBarNotification notif : this.getActiveNotifications()) { Log.i("","ID :" + notif.getId() + "\t" + notif.getNotification().tickerText + "\t" + notif.getPackageName()); } Log.i("","======================="); } @Override public void onNotificationRemoved( StatusBarNotification sbn) { Log.i("","---Notification Removed---"); Log.i("","ID :" + sbn.getId() + "\t" + sbn.getNotification().tickerText + "\t" + sbn.getPackageName()); Log.i("","--------------------------"); } public int onStartCommand(Intent intent, int flags, int startId) { Log.i("","Service Started"); return START_STICKY; } private void showNotification() { Bitmap bm = Bitmap.createScaledBitmap(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher),getResources().getDimensionPixelSize(android.R.dimen.notification_large_icon_width), getResources().getDimensionPixelSize(android.R.dimen.notification_large_icon_height),true); NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this) .setLargeIcon(bm) .setSmallIcon(android.R.color.transparent) .setOngoing(true) .setContentTitle(getResources().getString(R.string.app_name)) .setContentText(getResources().getString(R.string.notification_text)); Intent resultIntent = new Intent(this, MainActivity.class); TaskStackBuilder stackBuilder = TaskStackBuilder.create(this); stackBuilder.addParentStack(MainActivity.class); stackBuilder.addNextIntent(resultIntent); PendingIntent resultPendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT); mBuilder.setContentIntent(resultPendingIntent); mNotificationManager =(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); mNotificationManager.notify(01, mBuilder.build()); } public void onDestroy() { mNotificationManager.cancel(01); Log.i(" ","Service Stopped"); this.stopSelf(); } }
Mi lehet a hiba?
A válaszokat előre is köszönöm.
Mutasd a teljes hozzászólást!
A Notificationlistener service-t nem tudod leállítani! Te tudsz egy service-t indítani ami feliratkozik rá, próbáld azt, hogy regisztrálod magad rá és ha már nincs szükséged leiratkozol.

pl így regisztrálj.

nReceiver = new NotificationReceiver(); IntentFilter filter = new IntentFilter(); filter.addAction("com.goston.arduwatch.NOTIFICATION_LISTENER_EXAMPLE"); registerReceiver(nReceiver,filter);
leiratkozás:

@Override protected void onDestroy() { super.onDestroy(); unregisterReceiver(nReceiver); }
Bár igazándiból nem tudom mi lenne a feladata az app-nak, ezért lehet nem mindig releváns az irományom
Mutasd a teljes hozzászólást!

  • Le kell iratkoznod a NotificationListenerService-ről! Mert attól az még tovább él! Használd a

    stopService()-t amiben meg kell adni a Class nevét
    Mutasd a teljes hozzászólást!
  • A stopService ott van, sőt ugyanaz az intent amivel a startService-t használom. Ezért nem értem mi a probléma.
    Mutasd a teljes hozzászólást!
  • Bár még mindig nem tudom mi a probléma, egy részmegoldást találtam. Egy boolean-ban eltárolom a service kívánt állapotát, aztán ellenőrzöm, hogy mi az értéke, így a folyamat futva marad, de ha "kikapcsolom" , akkor nem csinál semmit.
    Mutasd a teljes hozzászólást!
  • Nem lehet hogy a gombod nem működik? mondjuk layout-on elírtad volna?
    Mutasd a teljes hozzászólást!
  • Nem, mert ha mást állítok be a gombra, akkor jól működik.
    Mutasd a teljes hozzászólást!
  • Egy ötletem maradt, így hirtelen, nem használtam még a StopSelf-et, esetleg még azt próbáld cserélni!
    Mutasd a teljes hozzászólást!
  • Már azt is próbáltam, ugyancsak eredménytelenül.
    Mutasd a teljes hozzászólást!
  • Mazsolázok én is! Elméletben jónak kéne lenni amit írtál leállításra, de nézzük már meg így is:

    stopService(new Intent(MainActivity.this, NotificationListener.class));
    Én ezt használom ami tökéletesen megy:



    MainActivity.java

    package com.example.create_stop_service; import android.os.Bundle; import android.app.Activity; import android.content.Intent; import android.view.Menu; import android.view.View; import android.widget.Button; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button start = (Button) findViewById(R.id.startService); Button stop = (Button) findViewById(R.id.stopservice); start.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub startService(new Intent(MainActivity.this, MyService.class)); } }); stop.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub stopService(new Intent(MainActivity.this, MyService.class)); } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } }



    MyService.java

    package com.example.create_stop_service; import android.app.Service; import android.content.Intent; import android.os.IBinder; import android.widget.Toast; public class MyService extends Service { @Override public IBinder onBind(Intent intent) { // TODO Auto-generated method stub return null; } @Override public void onCreate() { Toast.makeText(this, " MyService Created ", Toast.LENGTH_LONG).show(); } @Override public void onStart(Intent intent, int startId) { Toast.makeText(this, " MyService Started", Toast.LENGTH_LONG).show(); } @Override public void onDestroy() { Toast.makeText(this, "MyService Stopped", Toast.LENGTH_LONG).show(); } }



    Activity_main.xml

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity" > <Button android:id="@+id/startService" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentRight="true" android:layout_alignParentTop="true" android:layout_marginTop="90dp" android:text="Start Service" /> <Button android:id="@+id/stopservice" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@+id/startService" android:layout_alignParentRight="true" android:layout_below="@+id/startService" android:layout_marginTop="86dp" android:text="Stop Service" /> </RelativeLayout>



    AndroidManifest.xml

    <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.vibratephone_service" android:versionCode="1" android:versionName="1.0" > <uses-permission android:name="android.permission.VIBRATE"/> <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="17" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.example.vibratephone_service.MainActivity" 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=".VibrateService"/> </application> </manifest>
    Mutasd a teljes hozzászólást!
  • Ez volt az első variáció, csak ez után próbáltam ki a mostani megoldást. Nem tudom (még), hogy okozhat-e problémát az, hogy én egy notificationlistener service-t szeretnék leállítani.
    Mutasd a teljes hozzászólást!
  • A Notificationlistener service-t nem tudod leállítani! Te tudsz egy service-t indítani ami feliratkozik rá, próbáld azt, hogy regisztrálod magad rá és ha már nincs szükséged leiratkozol.

    pl így regisztrálj.

    nReceiver = new NotificationReceiver(); IntentFilter filter = new IntentFilter(); filter.addAction("com.goston.arduwatch.NOTIFICATION_LISTENER_EXAMPLE"); registerReceiver(nReceiver,filter);
    leiratkozás:

    @Override protected void onDestroy() { super.onDestroy(); unregisterReceiver(nReceiver); }
    Bár igazándiból nem tudom mi lenne a feladata az app-nak, ezért lehet nem mindig releváns az irományom
    Mutasd a teljes hozzászólást!
  • Köszönöm, majd kipróbálom így is, bár a mostani megoldásom működőképesnek tűnik. A feladat egyébként annyi lenne, hogy ha jön új értesítés, azt elküldi egy arduino-nak bluetooth-on, ami pedig megjeleníti egy kijelzőn. (Low budget okosóra)
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd