2014-11-26 8 views
7

Ich versuche, eine Android-Anwendung zu machen, die Wifi-Änderung gehört und etwas tut. Aber das Problem ist, dass es nicht funktioniert, wenn der Prozess beendet wird. Ich fand diese Frage, die besagt, dass es ohne Aktivität nicht funktioniert
How to create BroadcastReceiver without Activity/Service?Wie man den Broadcast-Empfänger der App weiter hören lässt, ohne dass ein Dienst im Hintergrund läuft

Das ist also keine Alternative. Daher habe ich eine Aktivität erstellt, die leer ist. Ich möchte keinen Dienst erstellen, der im Hintergrund läuft. Wie kann ich meine Anwendung weiterhin hören lassen, selbst wenn sie getötet wird? Ich habe die Sendung im Manifest registriert.

<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> 

    <receiver android:name="com.background.service.BroadCastReceiver"> 
     <intent-filter> 
      <action android:name="android.net.wifi.WIFI_STATE_CHANGED"/> 
      <action android:name="android.intent.action.BOOT_COMPLETED" /> 
     </intent-filter> 
    </receiver> 

Das ist meine Klasse

public class BroadCastReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
    //do some action 
    } 
} 
+0

-Service für das, was? Die Anmeldung im Manifest ist ausreichend. –

+1

Nun, die 'OnReceive' wird nicht aufgerufen, wenn die App getötet wird – Alex

+0

@Alex: Wie töten Sie die App? Kannst du die Schritte erwähnen? –

Antwort

1

Normalerweise, wenn app getötet und Broadcast kommt Ihre App-Prozess durch das System für Sie gestartet. Es gibt absolut keine Notwendigkeit, etwas Lebendiges oder tun alle zusätzlichen Manipulationen zu halten (warum sonst würden Sie brauchen BroadcastReceiver wenn Sie nur Service verwenden kann?)

1

beste Lösung ist es, einen Rundfunkempfänger zu machen, wird es funktionieren

public class NetworkChangeReceiver extends BroadcastReceiver { 

@Override 
public void onReceive(final Context context, final Intent intent) { 
    final ConnectivityManager connMgr = (ConnectivityManager) context 
      .getSystemService(Context.CONNECTIVITY_SERVICE); 

    final android.net.NetworkInfo wifi = connMgr 
      .getNetworkInfo(ConnectivityManager.TYPE_WIFI); 

    final android.net.NetworkInfo mobile = connMgr 
      .getNetworkInfo(ConnectivityManager.TYPE_MOBILE); 

    if (wifi.isAvailable() || mobile.isAvailable()) { 
     // Enjoy coding here 

     Log.d("Netowk Available ", "Flag No 1"); 
    } 
}} 

in manifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="com.example.broadcastreceiverforinternetconnection" 
android:versionCode="1" 
android:versionName="1.0" > 

<uses-sdk 
    android:minSdkVersion="8" 
    android:targetSdkVersion="17" /> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> 

<application 
    android:allowBackup="true" 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme" > 
    <receiver android:name=".NetworkChangeReceiver" > 
     <intent-filter> 
      <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> 
      <action android:name="android.net.wifi.WIFI_STATE_CHANGED" /> 
     </intent-filter> 
    </receiver> 
</application> 

+2

Wie unterscheidet sich das von dem, was ich versucht habe? – Alex

1

Sie bereits direkt mit dem Rundfunkempfänger und de tun klärt es das Manifest. Das ist alles was du tun musst. Es sind keine Dienste erforderlich, die im Hintergrund ausgeführt werden.

So stellen Sie sicher, dass Sie installieren und die App mindestens einmal sonst die Sendung empfängt

3

registriert wird nicht laufen Sieht aus wie Sie es mit einer Ausnahme im Manifest korrekt definieren haben. Der Rundfunkempfänger löst einen ANR aus, wenn er nicht innerhalb von 10 Sekunden abgeschlossen wird. http://developer.android.com/training/articles/perf-anr.html

in Ihrem Broadcast-Empfänger einfach einen Dienst starten.

public class ReceiverUpload extends BroadcastReceiver { 

@Override 
public void onReceive(Context context, Intent intent) { 
    context.startService(new Intent(context, ServiceUploader.class)); 
} 
} 

Dann in Ihrem Dienst einen AsyncTask gestartet werden, da Sie auf dem UI-Thread sein möchten nicht Sie zum Beispiel den gleichen Service aus einer Tätigkeit in der App zu starten.

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    // start asynctask to get off this thread 
    new MyBackGround().execute(startId); 
    return Service.START_REDELIVER_INTENT; 
} 

Der erste, was in der AsyncTask zu tun ist Check für wifi

Im Folgenden finden Sie Auszug aus einer Funktion Netzwerk überprüfen ich anrufen, wenn es die AsyncTask nur false zurückgibt beendet, wenn es wahr ist, es tut Netzwerk Zeug, das hey muss sowieso im Hintergrund sein, damit asynctask noch mehr Sinn macht.

// check for network connection 
     ConnectivityManager connMgr = (ConnectivityManager) context 
       .getSystemService(Context.CONNECTIVITY_SERVICE); 
     if (connMgr == null) { 
      return false; 
     } 

     // check ok to process 
     NetworkInfo networkInfo = connMgr.getActiveNetworkInfo(); 
     if (networkInfo == null || !networkInfo.isConnected()) { 
      return false; 
     } 

     boolean isWifi = networkInfo.getType() == ConnectivityManager.TYPE_WIFI; 
     if (!isWifi) { 

       return false; 

     } 

     return true; 

Beachten Sie in diesem Beispiel die startId zum AsyncTask geben wird verwendet OS abzubrechen die Absicht übermitteln.

@Override 
    public void onPostExecute(Integer startId) { 
     if (startId != null) { 
      stopSelfResult(startId); 
     } 
    } 
+0

Ich habe in den letzten Tagen ein paar Stimmen dazu bekommen. Ich möchte darauf hinweisen, dass der Hauptgrund, warum Sie einen Dienst starten, dann eine asynchrone Aufgabe ist, damit Sie eine coole, nette Benachrichtigung mit dem Hinweis "Hey, ich lade im Hintergrund" mit einem Fortschrittsbalken, vielleicht sogar mit einem Abbrechen-Knopf versehen. Nur damit der Nutzer weiß, dass Ihre App fair ist, wenn sie im Hintergrund läuft. – danny117

2

Das Beste, was für mich gearbeitet:

AndroidManifest

<receiver android:name="com.AEDesign.communication.WifiReceiver" > 
    <intent-filter android:priority="100"> 
    <action android:name="android.net.wifi.STATE_CHANGE" /> 
    </intent-filter> 
</receiver> 

BroadcastReceiver Klasse

public class WifiReceiver extends BroadcastReceiver { 

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

    NetworkInfo info = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO); 
    if(info != null) { 
    if(info.isConnected()) { 
     // Do your work. 

     // e.g. To check the Network Name or other info: 
    WifiManager wifiManager=(WifiManager)context.getSystemService(Context.WIFI_SERVICE); 
     WifiInfo wifiInfo = wifiManager.getConnectionInfo(); 
     String ssid = wifiInfo.getSSID(); 
    } 
    } 
} 
}   

Berechtigungen

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> 
0
` <receiver 
     android:name=".GcmBroadcastReceiver" 
     android:permission="com.google.android.c2dm.permission.SEND" > 
     <intent-filter> 
      <action android:name="com.google.android.c2dm.intent.RECEIVE" /> 
      <category android:name="com.Reading.home" /> 
     </intent-filter> 
    </receiver> 
    <service android:name=".GcmMessageHandler" />  

`

` public class API_gettoken extends AsyncTask { 
     Context context; 
    API_gettoken(Context context) { 
    this.context = context; 
    } 
    InterfaceSimpleStringResponce responce; 
    String regid; 
    void getresponce(InterfaceSimpleStringResponce responce) { 
    this.responce = responce; 
    } 
@Override 
protected Object doInBackground(Object... params) { 

    String PROJECT_NUMBER = "puthereprojectnumber"; 
    GoogleCloudMessaging gcm; 
    gcm = GoogleCloudMessaging.getInstance(context); 
    try { 
     regid = gcm.register(PROJECT_NUMBER); 
     Log.v("testing...........", regid); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    return null; 
    } 

@Override 
protected void onPreExecute() { 
    // TODO Auto-generated method stub 
    super.onPreExecute(); 
} 

@Override 
protected void onPostExecute(Object result) { 
    // TODO Auto-generated method stub 
    super.onPostExecute(result); 
    responce.message(regid); 
} 

@Override 
protected void onProgressUpdate(Object... values) { 
    // TODO Auto-generated method stub 
    super.onProgressUpdate(values); 
} 

@Override 
protected void onCancelled(Object result) { 
    // TODO Auto-generated method stub 
    super.onCancelled(result); 
} 

@Override 
protected void onCancelled() { 
    // TODO Auto-generated method stub 
    super.onCancelled(); 
    } 

} 

`

`public class GcmBroadcastReceiver extends WakefulBroadcastReceiver { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
     System.out.println("---------------------------" 
      + intent.getDataString()); 
    // Explicitly specify that GcmMessageHandler will handle the intent. 
    ComponentName comp = new ComponentName(context.getPackageName(), 
      GcmMessageHandler.class.getName()); 
    // Start the service, keeping the device awake while it is launching. 
    startWakefulService(context, (intent.setComponent(comp))); 
    setResultCode(Activity.RESULT_OK); 
    } 
    } 
    public class GcmMessageHandler extends IntentService { 
    String mes, ChatID, FromUser, GroupID; 
     private Handler handler; 

     public GcmMessageHandler() { 
     super("GcmMessageHandler"); 
     } 

@Override 
public void onCreate() { 
    // TODO Auto-generated method stub 
    super.onCreate(); 
    handler = new Handler(); 
} 

@Override 
protected void onHandleIntent(Intent intent) { 
    Bundle extras = intent.getExtras(); 

    GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(this); 
    // The getMessageType() intent parameter must be the intent you received 
    // in your BroadcastReceiver. 
    String messageType = gcm.getMessageType(intent); 

    mes = extras.getString("title"); 
    ChatID = extras.getString("ChatID"); 
    FromUser = extras.getString("FromUser"); 
    GroupID = extras.getString("GroupID"); 
    // showToast(); 
    shownotification(mes); 
    Log.i("GCM", 
      "Received : (" + messageType + ") " 
        + extras.getString("title")); 

    // GcmBroadcastReceiver.completeWakefulIntent(intent); 

} 

@SuppressLint("NewApi") 
private void shownotification(String message) { 

    NotificationManager mNotificationManager = (NotificationManager) 

       getSystemService(NOTIFICATION_SERVICE); 
    SharedPreferences sharedPrefs = getSharedPreferences(
      Constants.PREFERENCE_NAME, Context.MODE_PRIVATE); 
    if (!T4JTwitterLoginActivity.isConnected(GcmMessageHandler.this)) { 
     Intent showIntent = new Intent(this, SignIn.class); 

     showIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK 
       | Intent.FLAG_ACTIVITY_CLEAR_TASK); 
     PendingIntent contentIntent = PendingIntent.getActivity(this, 0, 
       showIntent, 0); 

     NotificationCompat.Builder mNotifyBuilder = new NotificationCompat.Builder(
       this).setContentTitle("Reading").setContentText(message) 
       .setDefaults(Notification.DEFAULT_ALL).setAutoCancel(true) 
       .setContentIntent(contentIntent) 
       .setSmallIcon(R.drawable.mainicon); 
     Notification notification = mNotifyBuilder.build(); 
     notification.flags |= Notification.FLAG_AUTO_CANCEL; 
     mNotificationManager.notify(0, notification); 
    } else { 
     ActivityManager activityManager = (ActivityManager) getBaseContext() 
       .getSystemService(Context.ACTIVITY_SERVICE); 
     List<RunningAppProcessInfo> LIST = activityManager 
       .getRunningAppProcesses(); 
     for (RunningAppProcessInfo runningAppProcessInfo : LIST) { 
      String PROSSES = runningAppProcessInfo.processName; 
      System.out.println(PROSSES); 
     } 
     if (sharedPrefs.contains("chatidx")) { 
      System.out.println((sharedPrefs.getString("chatidx", ""))); 
      if (ChatID.equals(sharedPrefs.getString("chatidx", ""))) { 

      } else { 
       callmethood(message); 
      } 
     } else { 
      callmethood(message); 
     } 
    } 
} 
    void callmethood(String message) { 
    NotificationManager mNotificationManager= 
       (NotificationManager)getSystemService(NOTIFICATION_SERVICE); 
    Intent showIntent = new Intent(this, Send_message.class); 
    SharedPreferences sharedPrefs = getSharedPreferences(
      Constants.PREFERENCE_NAME, Context.MODE_PRIVATE); 
    Editor e = sharedPrefs.edit(); 
    e.putString("ADMINX", FromUser); 
    e.putString("chatidx", ChatID); 
    e.putString("GID", GroupID); 
    e.commit(); 
    showIntent.putExtra("chatidx", ChatID); 
    showIntent.putExtra("ADMINX", FromUser); 
    showIntent.putExtra("GID", GroupID); 
    showIntent.putExtra("notification", ChatID); 

    showIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK 
      | Intent.FLAG_ACTIVITY_CLEAR_TASK); 
    PendingIntent contentIntent = PendingIntent.getActivity(this, 0, 
      showIntent, 0); 
    NotificationCompat.Builder mNotifyBuilder = new NotificationCompat.Builder(
      this).setContentTitle("Reading").setContentText(message) 
      .setDefaults(Notification.DEFAULT_ALL).setAutoCancel(true) 
      .setContentIntent(contentIntent) 
      .setSmallIcon(R.drawable.mainicon); 
    Notification notification = mNotifyBuilder.build(); 
    notification.flags |= Notification.FLAG_AUTO_CANCEL; 
    mNotificationManager.notify(0, notification); 
} 
public void showToast() { 
    handler.post(new Runnable() { 
     public void run() { 
      Toast.makeText(getApplicationContext(), mes, Toast.LENGTH_LONG) 
        .show(); 
     } 
    }); 
} 
} 

`

`public class GcmBroadcastReceiver extends WakefulBroadcastReceiver { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
     System.out.println("---------------------------" 
      + intent.getDataString()); 
    // Explicitly specify that GcmMessageHandler will handle the intent. 
    ComponentName comp = new ComponentName(context.getPackageName(), 
      GcmMessageHandler.class.getName()); 
    // Start the service, keeping the device awake while it is launching. 
    startWakefulService(context, (intent.setComponent(comp))); 
    setResultCode(Activity.RESULT_OK); 
    } 
    } 
    public class GcmMessageHandler extends IntentService { 
    String mes, ChatID, FromUser, GroupID; 
     private Handler handler; 

     public GcmMessageHandler() { 
     super("GcmMessageHandler"); 
     } 

@Override 
public void onCreate() { 
    // TODO Auto-generated method stub 
    super.onCreate(); 
    handler = new Handler(); 
} 

@Override 
protected void onHandleIntent(Intent intent) { 
    Bundle extras = intent.getExtras(); 

    GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(this); 
    // The getMessageType() intent parameter must be the intent you received 
    // in your BroadcastReceiver. 
    String messageType = gcm.getMessageType(intent); 

    mes = extras.getString("title"); 
    ChatID = extras.getString("ChatID"); 
    FromUser = extras.getString("FromUser"); 
    GroupID = extras.getString("GroupID"); 
    // showToast(); 
    shownotification(mes); 
    Log.i("GCM", 
      "Received : (" + messageType + ") " 
        + extras.getString("title")); 

    // GcmBroadcastReceiver.completeWakefulIntent(intent); 

} 

    @SuppressLint("NewApi") 
    private void shownotification(String message) { 

    NotificationManager mNotificationManager = (NotificationManager) 
        getSystemService(NOTIFICATION_SERVICE); 
    SharedPreferences sharedPrefs = getSharedPreferences(
      Constants.PREFERENCE_NAME, Context.MODE_PRIVATE); 
    if (!T4JTwitterLoginActivity.isConnected(GcmMessageHandler.this)) { 
     Intent showIntent = new Intent(this, SignIn.class); 

     showIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK 
       | Intent.FLAG_ACTIVITY_CLEAR_TASK); 
     PendingIntent contentIntent = PendingIntent.getActivity(this, 0, 
       showIntent, 0); 

     NotificationCompat.Builder mNotifyBuilder = new NotificationCompat.Builder(
       this).setContentTitle("Reading").setContentText(message) 
       .setDefaults(Notification.DEFAULT_ALL).setAutoCancel(true) 
       .setContentIntent(contentIntent) 
       .setSmallIcon(R.drawable.mainicon); 
     Notification notification = mNotifyBuilder.build(); 
     notification.flags |= Notification.FLAG_AUTO_CANCEL; 
     mNotificationManager.notify(0, notification); 
    } else { 
     ActivityManager activityManager = (ActivityManager) getBaseContext() 
       .getSystemService(Context.ACTIVITY_SERVICE); 
     List<RunningAppProcessInfo> LIST = activityManager 
       .getRunningAppProcesses(); 
     for (RunningAppProcessInfo runningAppProcessInfo : LIST) { 
      String PROSSES = runningAppProcessInfo.processName; 
      System.out.println(PROSSES); 
     } 
     if (sharedPrefs.contains("chatidx")) { 
      System.out.println((sharedPrefs.getString("chatidx", ""))); 
      if (ChatID.equals(sharedPrefs.getString("chatidx", ""))) { 

      } else { 
       callmethood(message); 
      } 
     } else { 
      callmethood(message); 
     } 
    } 
} 

    void callmethood(String message) { 
    NotificationManager mNotificationManager=   
     (NotificationManager)getSystemService(NOTIFICATION_SERVICE); 
    Intent showIntent = new Intent(this, Send_message.class); 
    SharedPreferences sharedPrefs = getSharedPreferences(
      Constants.PREFERENCE_NAME, Context.MODE_PRIVATE); 
    Editor e = sharedPrefs.edit(); 
    e.putString("ADMINX", FromUser); 
    e.putString("chatidx", ChatID); 
    e.putString("GID", GroupID); 
    e.commit(); 
    showIntent.putExtra("chatidx", ChatID); 
    showIntent.putExtra("ADMINX", FromUser); 
    showIntent.putExtra("GID", GroupID); 
    showIntent.putExtra("notification", ChatID); 

    showIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK 
      | Intent.FLAG_ACTIVITY_CLEAR_TASK); 
    PendingIntent contentIntent = PendingIntent.getActivity(this, 0, 
      showIntent, 0); 
    NotificationCompat.Builder mNotifyBuilder = new NotificationCompat.Builder(
      this).setContentTitle("Reading").setContentText(message) 
      .setDefaults(Notification.DEFAULT_ALL).setAutoCancel(true) 
      .setContentIntent(contentIntent) 
      .setSmallIcon(R.drawable.mainicon); 
    Notification notification = mNotifyBuilder.build(); 
    notification.flags |= Notification.FLAG_AUTO_CANCEL; 
    mNotificationManager.notify(0, notification); 
} 
public void showToast() { 
    handler.post(new Runnable() { 
     public void run() { 
      Toast.makeText(getApplicationContext(), mes, Toast.LENGTH_LONG) 
        .show(); 
     } 
    }); 
} 
} 

`

+0

Was davon zu verstehen? – kAmol

+0

Entschuldigung Mann, dass die Antwort geschrieben, wenn ich gerade android gestartet wurde :) @unknown – wadali

+0

Dann schlage ich vor, es zu bearbeiten – kAmol