تدفق البيانات بين Android Broadcastreceiver و ContentProvider والنشاط؟
سؤال
لقد طورت تطبيقًا يتلقى بثًا ثم يطلق Activity
, ، أين هذا Activity
الاستعلامات أ ContentProvider
الذي يسحب المعلومات من DNS في الوقت الفعلي.
أود أن أكون قادرًا على خلط هذا الأمر بحيث بدلاً من الذهاب:
BroadcastReceiver.onReceive() {
Intent intent = new Intent(...);
intent.setData(...); // set a single String data
context.startActivity(intent);
}
Activity.onCreate() {
String value = intent.getData(); // get the String data
Cursor = ContentProvider.query(search);
...
setContentView(...);
}
يذهب:
BroadcastReceiver.onReceive() {
Cursor = ContentProvider.query(...);
if (cursor != null) {
Intent intent = new Intent(...);
// how do I pass the cursor?
getContext().startActivity(intent);
}
}
Activity.onCreate() {
// how do I retrieve the cursor?
setContentView(...);
}
أي إذا query()
لا تُرجع أي بيانات أريد أن أفقد إطلاقهاActivity
, ، والسماح لرسالة البث أن تسقط من خلال المعتاد.
إذا query()
هل يعيد البيانات ، أريد ذلك Cursor
لتزويد Activity
, ، حتى لا أضطر إلى الذهاب والاستعلام عن البيانات مرة أخرى.
بدوره ، Activity
لديه واجهة المستخدم الخاصة التي يحتاج المستخدم للرد عليها.
هل هذا ممكن؟
المحلول
ما تريده أمر صعب إلى حد ما بالنسبة لي ، غير فعال إلى حد ما. أود أن أقترح استخدام البديل الأول ، ولكن عند تحميل المؤشر في النشاط ، تحقق مما إذا كانت هناك بيانات ، ثم الخروج من النشاط.
BroadcastReceiver.onReceive() {
Intent intent = new Intent(...);
intent.setData(...); // set a single String data
context.startActivity(intent);
}
Activity.onCreate() {
String value = intent.getData(); // get the String data
Cursor = ContentProvider.query(search);
if(cursor.isEmpty() ...){
finish();
return;
}
...
setContentView(...);
}
سيكون لهذا التأثير نفسه بالضبط ، وسيتم تحميل المؤشر إلا مرة واحدة ، وسيتم عرض النشاط فقط إذا كان هناك شيء ما في المؤشر. النفقات العامة الإضافية الوحيدة هي أن القصد يتم إطلاقه مهما كان الأمر ، لكن هذا ليس ضرائب بالضبط :)
لاحظ أنه لن يكون هناك أي وميض أو أي شيء أيضًا ، فإن Android يتعامل مع حالة الاتصال في OnCreate () (أعتقد أن onStart و Onresume أيضًا) حتى لا يعرف المستخدم أبدًا أنه حدث.
نصائح أخرى
ستحتاج إلى العثور على أو صنع مؤشر قابل للتسلسل أو قابل للطرد (ثم استخدام intent.setextra ()). أو ربما يكون من الممكن بدلاً من ذلك قراءة جميع البيانات كطرود ونقلها إلى النشاط؟