سؤال

لقد واجهت بعض المشكلات التي تحاول تمرير البيانات من خلال النوايا المعلقة إلى النية إلى broadcastreceiver ، فيما يتعلق بتنبيهات القرب. وبشكل أكثر تحديداً ، أحاول تمرير كائن ، أنه من بين أمور أخرى ، يحمل وضع المستخدم المتغير باستمرار. لقد جربت العديد من التكتيكات التي يتم اقتراحها هنا (وليس فقط) ولكن لا شيء يعمل ، مما أدى إلى إما القيم الخالية أو في نفس الوقت الذي تم إنشاؤه ، عندما يتم استرداد النية على جانب Broadcastreiver. التكتيكات المستخدمة:

  • وضع علامة على القصد الذي يحمل الكائن مع: flag_activity_new_task+flag_activity_clear_top+flag_activity_single_top النتيجة: القيم الفارغة على جانب BroadAcastReceiver
  • وضع علامة على النية المعلقة التي تم إنشاؤها باستخدام النية الأولية ، مع: flag_update_current أو flag_cancel_current النتيجة: قيم فارغة على جانب broadacastreceiver
  • الحصول على معرف عشوائي للقصد أو القصد المعلق باستخدام System.CurrentTimeMillis () ؛ النتيجة: لا يتم إطلاق النوايا أو استلامها على الإطلاق
  • لا شيء موصوف أعلاه. النتيجة: استرداد نفس القيمة الأولية في كل مرة.

رمز لطريقة الاتصال (تم تجريده من أي تجارب/قيم فارغة):

private void setProximityAlert(MyCar myCar) { 
  String locService = Context.LOCATION_SERVICE; 
  LocationManager locationManager; 
  locationManager = (LocationManager)getSystemService(locService);
  float radius = myCar.getMyCarRadius(); 
  long expiration = myCar.getMyCarExpiration(); 
  myService.setMyDriverLat(userLat);//setting user's position
  myService.setMyDriverLng(userLng);//setting user's position
  Intent  intent = new Intent(myCar.getMyCarName());
  intent.putExtra("myCar",myCar);

  PendingIntent proximityIntent = PendingIntent.getBroadcast(this, -1, intent, 0);
  locationManager.addProximityAlert(myCar.getMyCarLat(), myCar.getMyCarLng(), radius, expiration, proximityIntent);
 }

رمز لأسلوب الاتصال الذي يحدد مرشح النية ويسجل برودكاسستير:

public void addNewCarPoint (MyCar myCar){
        IntentFilter filter = new IntentFilter(myCar.getMyCarName());
        registerReceiver(new ProximityAlertReceiver(), filter);
        setProximityAlert(myCar);
    }

رمز لجانب BroadcastReceiver:

public class ProximityAlertReceiver extends BroadcastReceiver {
 @Override
 public void onReceive (Context context, Intent intent) {
 MyCar myCar=(MyCar)intent.getParcelableExtra("myCar");
  driverLoc=(String)Double.toString(myCar.getMyDriverLat());
  Toast.makeText(context, userLoc, Toast.LENGTH_SHORT).show();
  Intent i = new Intent(context, MyCarDiscoveryPrompt.class);
  context.startActivity(i);//firing intent
 }
 public void intentDataLoader(){      
 }

}

أي أفكار ستكون أكثر من موضع ترحيب. شكرا لكم مقدما.

هل كانت مفيدة؟

المحلول

حسنًا ، أعتقد أنني وجدت شيئًا:

لقد وضعت broadcastreceiver (proximityalerreceiver) ، تستخدم لاكتشاف تنبيهات القرب في نفس الفئة (mycartracking.class) ، حيث يوجد موقع locationlistener.class. هذا ، يوفر وصولًا فوريًا إلى تحديثات المواقع الجديدة ، مما يؤدي إلى إنشاء نية جديدة ملفوفة في معلقة جديدة لإطلاقها على Broadcastreceiver (فقط عند استيفاء معايير القرب). Flags: flag_activity_new_task+flag_activity_single_top و flag_cancel_current على القصد والمعنطي ، على التوالي. اكثر تحديدا:

رمز لموقع LocationListener:

private final LocationListener locationListener = new LocationListener() { 
        public void onLocationChanged(Location location) {
            updateWithNewLocation(location);//update application based on new location
        }
        public void onProviderDisabled(String provider){ 
            updateWithNewLocation(null);//update application if provider disabled
        }
        public void onProviderEnabled(String provider){
            // Update application if provider enabled
        } 
        public void onStatusChanged(String provider, int status, Bundle extras){ 
            //update application if provider hardware status changed
        }
    };

رمز Method لـ setProximityAlert ():

private void setProximityAlert() { 
    String locService = Context.LOCATION_SERVICE; 
    Context context =getApplicationContext();
    LocationManager locationManager; 
    locationManager = (LocationManager)getSystemService(locService);
    float radius = myCar.getMyCarRadius(); 
    long expiration = myCar.getMyCarExpiration(); 
    Intent  intent = new Intent(CAR_DISCOVERED);
    intent.putExtra("myCar",myCar);
    locationManager.getLastKnownLocation(provider);
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);//flagging intent
    PendingIntent proximityIntent = PendingIntent.getBroadcast(context, -1, intent, PendingIntent.FLAG_CANCEL_CURRENT);//flagging pendingIntent         
    locationManager.addProximityAlert(myCar.getMyCarLat(), myCar.getMyCarLng(), radius, expiration, proximityIntent);//setting proximity alert
}

يعمل هذا الحل الذي ينتج عن نوايا جديدة مع تحديثات موقع جديد. شكرا لكم جميعا على مساعدتك واهتمامك :)

نصائح أخرى

حاول إضافة intent.setData (URI) ؛ حيث تعتبر URI قيمة فريدة لكل نية معلقة

لقد كنت أعاني من هذه المشكلة أيضًا. استغرق الأمر لي ليلة كاملة لأجد أن خطأ غريب كان لدي مرتبط بهذه القضية.

إليك مناقشة جيدة حول رمز Google حول هذا الموضوع: http://groups.google.com/group/android-developers/browse_thread/thread/b2060b27c8934921

لقد قمت بحل جميع مشاكلي بواسطة (AB) باستخدام كل من URI في SetData ورمز الطلب (المحجوز) في PendingEvent.gething.

أنا أيضًا أستخدم flag_cancel_current على نواياتي وأتأكد فقط من النعائم المعلقة التي تشترك في نفس الغرض ، تحصل على نفس البيانات والإجراءات و URI.

أتمنى أن يساعد ذلك قليلاً.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top