Android BroadcastReceiver onReceive () wurde zweimal auf Android 4.0 aufgerufen

Ich habe ein Problem auf Android 4.0.3 (auf 4.1.2 es funktioniert gut). Ich habe in meinem Activity BroadcastReceiver. Wenn ich eine Sendung sende, die Methode onReceive () immer zweimal angerufen hat. Bitte geben Sie mir Anregungen zu BroadcastReceiver Unterschiede auf 4.0 und 4.1

private final GcmBroadcastReceiver gcmReceiver = new GcmBroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { final String action = intent.getAction(); if (action != null && action.equals(MyBroadcastReceiver.ACTION)) { Log.d("tag", intent.getStringExtra("alert")); } } }; }; @Override protected void onPause() { unregisterReceiver(gcmReceiver); super.onPause(); } @Override protected void onResume() { super.onResume(); registerGcmReceiver(); } private void registerGcmReceiver() { IntentFilter filter = new IntentFilter(MyBroadcastReceiver.ACTION); filter.setPriority(2); filter.addCategory("com.android.mypackage"); registerReceiver(gcmReceiver, filter); } 

  • Wie kann ich ORMLite mit SQLCipher zusammen in Android verwenden?
  • Android: Fehler Popup auf EditText nicht nach unten verschieben, wenn Tastatur geht weg
  • Lazy Loading funktioniert nicht richtig
  • PhoneGap Geolocation scheitert immer auf Timeout
  • Threading Beispiel in Android
  • Berechtigung von Manifest funktioniert nicht in Android 6
  • Problem mit EditText Hintergrund (Android)
  • Ich möchte genaue Lage mit google fused location api bekommen?
  • Android Studio - IBus vor 1.5.11 kann zu Problemen führen. Siehe IDEA-78860 für Details
  • Kann com.google.android.maps.MapView nicht importieren
  • Ändern Sie die Bildschirmausrichtung - Android 3.2 auf VirtualBox
  • Wie drehe ich meine Anwendung um 180 Grad umgedreht auf rotierendes Gerät um 180 Grad auf den Kopf?
  • 9 Solutions collect form web for “Android BroadcastReceiver onReceive () wurde zweimal auf Android 4.0 aufgerufen”

    Kurze Antwort: Es gibt keinen Unterschied. Die BroadcastReceiver Klasse für beide ist von Android 2.3.2 r1.

    Ich habe ein ähnliches Problem gehabt, aber für mich war es mit einem HTC Desire HD mit Android 2.3.5 drauf – die Benachrichtigungen von GCM würden immer zweimal erhalten. Ich habe es nicht geschafft, die Wurzel des Problems zu finden, aber es gibt einen Workaround. Sie können eine eindeutige ID für jede Benachrichtigung im Server generieren und sie zusammen mit den aktuellen Daten senden. Dann können Sie in Ihrem Receiver eine Zuordnung der eindeutigen ID zu Benachrichtigungsdaten aktualisieren, und wenn es bereits Daten für die angegebene ID gibt, ignorieren Sie sie einfach.

    Ich habe das wohl nicht klar gemacht, also hier ein Beispiel:

     public void onReceive(Context context, Intent intent) { String id = intent.getStringExtra("notificationID"); if (myMap.get(id) != null) return; final String action = intent.getAction(); if (action != null && action.equals(MyBroadcastReceiver.ACTION)) { Log.d("tag", intent.getStringExtra("alert")); myMap.put(id, *any value you need*); } } 

    Wenn Sie keine zusätzlichen Daten speichern müssen, können Sie ein HashSet anstelle einer Map verwenden und nur überprüfen, ob es die ID enthält.

    In der Regel wird onReceive zweimal angerufen, da die Leute die Sendung an 2 Standorten registrieren. Wahrscheinlich sind Sie in Ihrem onCreate und in Ihrem onResume registriert. (Wählen Sie einen Ort zu registrieren).

    Obwohl Sie es vielleicht schon ein Dutzend Mal getan haben – es wird immer empfohlen, einen weiteren Blick auf den Activity Life Cycle zu werfen .

    Ich hatte das gleiche Problem.

    onReceive() wird zweimal aufgerufen, weil ich den Broadcast Receiver zweimal registriert habe. Einer in meiner Aktivität onCreate() und ein anderer in manifest .

    Ich entferne die Empfangsregistrierung von onCreate() und es funktioniert gut. Registrieren Sie Ihren Sender in nur einem von ihnen.

    Es gibt zwei Möglichkeiten, dies zu tun:

    • Statisch in der Manifestdatei.
    • Dynamisch im Code.

    Welche Methode (statisch oder dynamisch) zu verwenden, hängt ganz davon ab, was du versuchst zu tun. Grundsätzlich, wenn Sie einige Änderungen direkt auf dem Bildschirm (Startbildschirm, Launcher, Statusleiste usw.) durchführen möchten, indem Sie einige Benachrichtigung oder einen Indikator in der Statusleiste anzeigen, indem Sie systemweite Ereignisse oder möglicherweise die von anderen Apps gesendeten, Dann ist es sinnvoll, statisch registrierte Rundfunkempfänger zu verwenden. Auf der Grundlage von ähnlichen Ereignissen, die Sie in Ihrer App ändern möchten, wenn der Benutzer es benutzt oder vielleicht ist es in den Hintergrund gesetzt, dann ist es sinnvoll, dynamisch registrierte Empfänger zu verwenden, die zuletzt bis die registrierenden Komponenten zerstört werden.

    Für weitere Informationen: http://codetheory.in/android-broadcast-receivers/

    Inatialize BroadcastReciver auf onStart() . Dies behebe mein Problem.

    Sie können auch implementieren, indem Sie ein Boolesches Flag setzen, wenn Sie die Funktion onReceived () eingeben

    Ich glaube, das ist der richtige Weg, um festzustellen, ob Wifi verbunden oder getrennt hat.

    Die Methode onReceive () im BroadcastReceiver: Setzen Sie einfach eine einfache Überprüfung (es ist eine Logik, die von SharedPreferences implementiert wird):

     package com.example.broadcasttest; import java.util.List; import java.util.Random; import android.app.Activity; import android.app.ActivityManager; import android.app.ActivityManager.RunningTaskInfo; import android.content.BroadcastReceiver; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.util.Log; import android.widget.Toast; public class CustomReceiver extends BroadcastReceiver { boolean isInternetPresent = false; @Override public void onReceive(Context context, Intent intent) { // TODO Auto-generated method stub ActivityManager am = (ActivityManager) context .getSystemService(Activity.ACTIVITY_SERVICE); String packageName = am.getRunningTasks(1).get(0).topActivity .getPackageName(); @SuppressWarnings("deprecation") List<RunningTaskInfo> taskInfo = am.getRunningTasks(1); ComponentName componentInfo = taskInfo.get(0).topActivity; if(packageName.equals("com.example.broadcasttest") && taskInfo.get(0).topActivity.getClassName().toString().equals("com.example.broadcasttest.MainActivity")) { // SharedPreferences sharedPreferences=context.getSharedPreferences("FLAG", Context.MODE_PRIVATE); // String check=sharedPreferences.getString("check",""); ConnectionDetector cd = new ConnectionDetector(context); // get Internet status isInternetPresent = cd.isConnectingToInternet(); // check for Internet status if (isInternetPresent) { SharedPreferences sharedPreferences=context.getSharedPreferences("FLAG", Context.MODE_PRIVATE); String check=sharedPreferences.getString("check",""); if(check.equals("chkd1")){ Log.d("activity name", "CURRENT Activity ::" + taskInfo.get(0).topActivity.getClassName()+" Package Name : "+componentInfo.getPackageName()); String abc = context.getClass().toString(); Toast.makeText(context, "hiiii "+abc, Toast.LENGTH_SHORT).show(); Log.e("ghorar kochu", "checking:"); MainActivity m = new MainActivity(); m.abc(context); } else if(check.equals("chkd")) { Log.e("Thanks For the checking", "checking:"+check); } } else if (!isInternetPresent) { SharedPreferences sharedPreferences1=context.getSharedPreferences("FLAG", Context.MODE_PRIVATE); SharedPreferences.Editor editor1=sharedPreferences1.edit(); editor1.putString("check","chkd1"); editor1.commit(); } } } } 

    Dies ist die tatsächliche Empfänger class.Now kommen, um die Haupttätigkeit.

     package com.example.broadcasttest; import java.net.URLEncoder; import java.util.ArrayList; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.os.AsyncTask; import android.os.Bundle; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.ListView; import android.widget.Toast; public class MainActivity extends Activity { Button btn; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); SharedPreferences sharedPreferences1=getSharedPreferences("FLAG", Context.MODE_PRIVATE); SharedPreferences.Editor editor1=sharedPreferences1.edit(); editor1.putString("check","chkd1"); editor1.commit(); btn = (Button)findViewById(R.id.btn); btn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub Intent in =new Intent(MainActivity.this,Second.class); startActivity(in); } }); } public void abc(Context context){ try{ SharedPreferences sharedPreferences1=context.getSharedPreferences("FLAG", Context.MODE_PRIVATE); SharedPreferences.Editor editor1=sharedPreferences1.edit(); editor1.putString("check","chkd"); editor1.commit(); } catch(NullPointerException e) { e.printStackTrace(); } new JsonForTimeLineList().execute(); } class JsonForTimeLineList extends AsyncTask<Void, Void, Void> { private String msg = null; @Override protected void onPreExecute() { super.onPreExecute(); // pDialog.show(); } @Override protected Void doInBackground(Void... params) { return null; } @Override protected void onPostExecute(Void resultaaa) { Log.e("hi", "helo"); } } } 

    Dieser Code funktioniert nur, wenn Ihre App onresume Zustand ist und wenn es in MainActivity ist.

    Hier ist meine ConnectionDetector Klasse. Durch die ich überprüfe die Verbindung von wifi.

     package com.example.broadcasttest; import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; import android.net.ConnectivityManager; import android.net.NetworkInfo; public class ConnectionDetector { private Context _context; public ConnectionDetector(Context context){ this._context = context; } public boolean isConnectingToInternet(){ ConnectivityManager connectivity = (ConnectivityManager) _context.getSystemService(Context.CONNECTIVITY_SERVICE); if (connectivity != null) { NetworkInfo[] info = connectivity.getAllNetworkInfo(); if (info != null) for (int i = 0; i < info.length; i++) if (info[i].getState() == NetworkInfo.State.CONNECTED) { return true; } } return false; } } 

    Und hier ist mein Manifest.xml

     <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.broadcasttest" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="21" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.INTERNET" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".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> <activity android:name=".Second" android:label="@string/app_name" > </activity> <receiver android:name="com.example.broadcasttest.CustomReceiver"> <intent-filter > <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/> </intent-filter> </receiver> </application> </manifest> 

    Und hier ist mein log, wenn ich das wifi aktivieren kann.

     11-19 20:13:11.474: D/activity name(25417): CURRENT Activity ::com.example.broadcasttest.MainActivity Package Name : com.example.broadcasttest 11-19 20:13:11.481: E/ghorar kochu(25417): checking: 11-19 20:13:11.542: E/hi(25417): helo 11-19 20:13:11.573: V/RenderScript(25417): Application requested CPU execution 11-19 20:13:11.580: V/RenderScript(25417): 0xb90a7850 Launching thread(s), CPUs 4 11-19 20:13:17.158: E/Thanks For the checking(25417): checking:chkd 

    Wenn du irgendeine Frage hast, lass es mich einfach wissen

    Ich hatte ein ähnliches Problem, aber mein BroadcastReceiver war statisch, weil ich es als eine innere Klasse verwenden wollte, was ich tat, war, den Receiver zu registrieren (um die statische Instanz zu erstellen), dann unregistrieren denselben Empfänger, der es gemacht hat Einmal genannt, was durch den AlarmManager Timer ist, ist natürlich viel erläuternd:

     public void setAlarm(Context context) { Log.d("EX", "Alarm SET !!"); Intent intent = new Intent("com.example.START_ALARM"); IntentFilter myIf = new IntentFilter("com.example.START_ALARM"); PendingIntent sender = PendingIntent.getBroadcast(context, 192837, intent, PendingIntent.FLAG_UPDATE_CURRENT); myBroadcastReceiver mbr = new myBroadcastReceiver(); // ****Here goes the trick.**** context.registerReceiver(mbr, myIf); context.unregisterReceiver(mbr); // Get the AlarmManager service AlarmManager am = (AlarmManager) context .getSystemService(Context.ALARM_SERVICE); Long firstTime = SystemClock.elapsedRealtime() + TimeUnit.SECONDS.toMillis(70); am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, firstTime, TimeUnit.SECONDS.toMillis(70), sender); } 

    Ich habe gerade dieses Problem und ich fand eine Lösung, die in keiner der vorhandenen Antworten erwähnt wurde, also würde ich es gerne teilen.

    Ich registriere den BroadcastReceiver nur einmal in onCreate

    Allerdings habe ich es so registriert:

     LocalBroadcastManager.getInstance(this).registerReceiver(new MyBroadcastReceiver(), mStatusIntentFilter); 

    Mit anderen Worten, ich baute die BoradcastReceiver-Instanz im RegisterReceiver- Aufruf.

    Aber wenn ich den BroadcastReceiver in einer separaten Aussage konstruiere, wurde das Problem gelöst. So was:

     MyBroadcastReceiver myBroadcastReceiver = new MyBroadcastReceiver(); LocalBroadcastManager.getInstance(this).registerReceiver(myBroadcastReceiver , mStatusIntentFilter); 

    Sehr seltsame Workaround, vielleicht ist es ein Fehler, der später behoben wird.

    Ich habe in meiner Service-Klasse mehrmals sendBroadcast(intent)

    Das Entfernen eines von ihnen hat das Problem behoben.

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.