কোনও পরিষেবার মধ্যে ব্রডকাস্ট রিসিভার


90

আমি একটি BroadcastReceiverমধ্যে একটি শুরু করার চেষ্টা করছি Service। আমি যা করার চেষ্টা করছি তার পটভূমি চলছে serviceযা আগত পাঠ্য বার্তাগুলি সংগ্রহ করে এবং আগত ফোন কলগুলি লগ করে। আমি এটির সর্বাধিক উত্তম উপায়টি আবিষ্কার করেছিলাম এমন একটি serviceরান করা যা কোনও সম্প্রচার রিসিভারকে অন্তর্ভুক্ত করে যা ক্যাটালগ করতে পারে।

কিভাবে আমি এই কাজ সম্পর্কে যান? আমি ইতিমধ্যে আমার সেবা চালু এবং চলমান আছে।

উত্তর:


127

আপনার পরিষেবা যেমন ইতিমধ্যে সেটআপ হয়ে গেছে, কেবল আপনার সেবার একটি ব্রডকাস্ট রিসিভার যোগ করুন:

private final BroadcastReceiver receiver = new BroadcastReceiver() {
   @Override
   public void onReceive(Context context, Intent intent) {
      String action = intent.getAction();
      if(action.equals("android.provider.Telephony.SMS_RECEIVED")){
        //action for sms received
      }
      else if(action.equals(android.telephony.TelephonyManager.ACTION_PHONE_STATE_CHANGED)){
           //action for phone state changed
      }     
   }
};

আপনার পরিষেবাতে onCreateএটি করুন:

IntentFilter filter = new IntentFilter();
filter.addAction("android.provider.Telephony.SMS_RECEIVED");
filter.addAction(android.telephony.TelephonyManager.ACTION_PHONE_STATE_CHANGED);
filter.addAction("your_action_strings"); //further more
filter.addAction("your_action_strings"); //further more

registerReceiver(receiver, filter);

এবং আপনার পরিষেবাতে onDestroy:

unregisterReceiver(receiver);

এবং আপনি যে ফিল্টারটি উল্লেখ করেছেন তার জন্য সম্প্রচার গ্রহণ করতে আপনি ভাল onCreate। প্রয়োজনে কোনও অনুমতি যোগ করার বিষয়টি নিশ্চিত করুন। যেমন

<uses-permission android:name="android.permission.RECEIVE_SMS" />

আমি লক্ষ্য করেছি যে সেন্ডড্রোডকাস (অভিপ্রায়) প্রেরণ করার সময় আমি ইন্টেন্ট.সেটডাটা (মাইআউরি) দ্বারা ডেটা পাস করতে পারি না এবং ব্রোয়াডকাস্টারসিভার সে ক্ষেত্রে কাজ করে না, এটি কি ঠিক?
ডেডফিশ

আমি যখন ব্রডকাস্টরিসিভার নিয়ে থাকি তখন পরিষেবা জীবন-চক্র সম্পর্কে আমি কিছুটা বিভ্রান্তি বোধ করি (আমার ক্ষেত্রে ব্রডকাস্টআরসিভার ডাউনলোড করুন)
অ্যান্ড্রয়েড ম্যান

4
@ ওয়াকসলাম আপনি কি নিজের ম্যানিফেস্টে এই ব্রডকাস্টার্সিভার সেট করেছেন?
ইগোরগানাপলস্কি

4
@ আইগরগানাপলস্কি না, আপনাকে এই জাতীয় রিসিভারগুলি ম্যানিফেস্টে নিবন্ধ করার দরকার নেই।
ওয়াকসলাম

4
@ সায়েদরিজওয়ান আপনার পরিষেবা এবং ব্রডকাস্টার্সিভার একই প্রক্রিয়া এবং সম্ভবত একই থ্রেডের অধীনে চলবে (যদি আপনি কোনও নতুন তৈরি না করেন)। আপনি কীভাবে আপনার থ্রেড (পটভূমি / পূর্বভূমি) এবং সংখ্যার সম্প্রচারের পরিমাণ নির্ধারণ করেছেন তার উপর ব্যাটারি খরচ নির্ভর করে
ওয়াকসলাম 20

25

আরও ভাল প্যাটার্ন হ'ল স্ট্যান্ডুলোন তৈরি করা BroadcastReceiver। এটি নিশ্চিত করে যে আপনার অ্যাপটি সম্প্রচারে প্রতিক্রিয়া জানাতে পারে, Serviceচলমান আছে কি না । প্রকৃতপক্ষে, এই প্যাটার্নটি ব্যবহার করা Serviceপুরোপুরি ধ্রুবক চলমান প্রয়োজনকে সরিয়ে ফেলতে পারে ।

BroadcastReceiverআপনার ম্যানিফেস্টে নিবন্ধন করুন এবং এর জন্য একটি পৃথক শ্রেণি / ফাইল তৈরি করুন।

যেমন:

<receiver android:name=".FooReceiver" >
    <intent-filter >
        <action android:name="android.provider.Telephony.SMS_RECEIVED" />
    </intent-filter>
</receiver>

যখন রিসিভারটি চলতে থাকে, আপনি কেবল একটি Intent( Bundle)) এর কাছে দিয়ে যান Serviceএবং এতে প্রতিক্রিয়া জানান onStartCommand()

যেমন:

public class FooReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        // do your work quickly!
        // then call context.startService();
    }   
}

6
আমি চাই ব্রডকাস্টটি পরিষেবার জীবনের চক্রের মধ্যে থাকুক, যাতে অ্যাপ্লিকেশনটি পরিষেবার সময়সীমা অনুসারে কেবল বার্তা / ফোন কলগুলি অনুসন্ধান করে। এই পদ্ধতিটি কি এটি সক্ষম করে? দেখে মনে হচ্ছে আপনি এটি সেট আপ করেছেন তাই সম্প্রচারের অভ্যর্থনা পরিষেবাটি বন্ধ করে দেয়।
ইউটোপিয়া025

Serviceযদি ইতিমধ্যে এটি চালু না থাকে তবে এই বাস্তবায়নটি শুরু হবে, বা Intentএটি পুনরুদ্ধারের জন্য একটি নতুন পাস করবে onStartCommand। আপনি শুধুমাত্র যখন এটি চালানোর জন্য চান Serviceলাইভ হয়, তাহলে আপনি প্রোগ্রামেটিক্যালি সক্ষম / অক্ষম পারে Receiverমাধ্যমে উপাদান PackageManagerএর setComponentEnabledSetting()
পল বার্ক

4
ওয়াকাসের উত্তরটি আপনার সেরা বিকল্প হতে পারে, যদি আপনি কেবল Receiverযখন জীবিত চান তখন Serviceচলমান।
পল বার্ক

4
আপনি একটি কার্যকলাপে থাকা অবস্থায় না থাকে, তাহলে এটা করবে এপিআই 3.1 এবং উচ্চতর জন্য কাজ না: ashimita.blogspot.com.tr/2012/04/...
Elif

4
অ্যানড্রয়েড ৩.১-এর হিসাবে অ্যান্ড্রয়েড সিস্টেম সমস্ত প্রাপককে পূর্বনির্ধারিতভাবে অভিপ্রায় গ্রহণ থেকে বাদ দেয় যদি সংশ্লিষ্ট অ্যাপ্লিকেশনটি কখনও ব্যবহারকারী দ্বারা শুরু না করা হয় বা যদি ব্যবহারকারী স্পষ্টভাবে অ্যান্ড্রয়েড মেনু দিয়ে অ্যাপ্লিকেশনটি বন্ধ করে দেয়। vogella.com
জুরাজ পেট্রিক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.