ফোরগ্রাউন্ড পরিষেবা অ্যান্ড্রয়েড দ্বারা নিহত হচ্ছে


86

আপডেট : আমি সমস্যার সঠিক সমাধান খুঁজে পাইনি। আমি যা নিয়ে এসেছি তা হ'ল সংযোগটি যে কোনও সময় হারিয়ে যাওয়ার পরে কোনও পূর্ববর্তী ব্লুটুথ ডিভাইসে স্বয়ংক্রিয়ভাবে পুনঃসংযোগ করার একটি পদ্ধতি। এটি আদর্শ নয়, তবে এটি মোটামুটি ভালভাবে কাজ করবে বলে মনে হচ্ছে। আমি যদিও এই সম্পর্কে আরও কোনও পরামর্শ শুনতে চাই।

আমার এই প্রশ্নের মতোই একই সমস্যা রয়েছে: ওয়েক লক ধরে রাখার পরে এবং ডিভাইস (আসুস ট্রান্সফরমার) সহ স্টার্টফোরগ্রাউন্ডে কল করার পরে পরিষেবাটি বন্ধ হয়ে যাওয়ার পরে, পরিষেবাটি বন্ধ হওয়ার আগে সময়ের দৈর্ঘ্য (30-45 মিনিট), এর ব্যবহার ওয়েক লক, স্টার্টফোরগ্রাউন্ড () ব্যবহার এবং স্ক্রিনটি বন্ধ হয়ে যাওয়ার পরে অ্যাপটি খোলা থাকলে সমস্যাটি ঘটে না তা এই সত্য।

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

সংযুক্ত প্রশ্নের উত্তর অনুসারে, স্টার্টফোরগ্রাউন্ড () "কোনও পরিষেবা নিহত হওয়ার সম্ভাবনা হ্রাস করে, তবে এটি প্রতিরোধ করে না"। আমি বুঝতে পারি যে এটি হওয়া উচিত, তবে আমি অন্যান্য অ্যাপ্লিকেশনগুলির অনেকগুলি উদাহরণ দেখেছি যাতে এই সমস্যা নেই (উদাহরণস্বরূপ, টাস্কার)।

ব্যবহারকারীর দ্বারা বন্ধ না হওয়া অবধি পরিষেবা চালানোর ক্ষমতা ছাড়াই আমার অ্যাপ্লিকেশনটির কার্যকারিতা হ্রাস পাবে। এড়াতে কি কোন উপায় আছে ???

আমি যখনই পরিষেবা বন্ধ করে দিচ্ছি তখন আমার লগকটে এটি দেখতে পাচ্ছি:

ActivityManager: No longer want com.howettl.textab (pid 32321): hidden #16
WindowManager: WIN DEATH: Window{40e2d968 com.howettl.textab/com.howettl.textab.TexTab paused=false
ActivityManager: Scheduling restart of crashed service com.howettl.textab/.TexTabService in 5000ms

সম্পাদনা: আমার এও লক্ষ্য করা উচিত, আমি যে ডিভাইসে সংযুক্ত রয়েছি তা অন্য ডিভাইসে ঘটেছিল বলে মনে হয় না: এইচটিসি লেজেন্ড সায়ানোজেন চলছে

সম্পাদনা: এখানে ফলাফল adb shell dumpsys activity services:

* ServiceRecord{40f632e8 com.howettl.textab/.TexTabService}

intent={cmp=com.howettl.textab/.TexTabService}

packageName=com.howettl.textab

processName=com.howettl.textab

baseDir=/data/app/com.howettl.textab-1.apk

resDir=/data/app/com.howettl.textab-1.apk

dataDir=/data/data/com.howettl.textab

app=ProcessRecord{40bb0098 2995:com.howettl.textab/10104}

isForeground=true foregroundId=2 foregroundNoti=Notification(contentView=com.howettl.textab/0x1090087 vibrate=null,sound=null,defaults=0x0,flags=0x6a)

createTime=-25m42s123ms lastActivity=-25m42s27ms

 executingStart=-25m42s27ms restartTime=-25m42s124ms

startRequested=true stopIfKilled=false callStart=true lastStartId=1

Bindings:

* IntentBindRecord{40a02618}:

  intent={cmp=com.howettl.textab/.TexTabService}

  binder=android.os.BinderProxy@40a9ff70

  requested=true received=true hasBound=true doRebind=false

  * Client AppBindRecord{40a3b780 ProcessRecord{40bb0098 2995:com.howettl.textab/10104}}

    Per-process Connections:

      ConnectionRecord{40a76920 com.howettl.textab/.TexTabService:@40b998b8}

All Connections:

  ConnectionRecord{40a76920 com.howettl.textab/.TexTabService:@40b998b8}

এবং এর ফলাফল adb shell dumpsys activity:

* TaskRecord{40f5c050 #23 A com.howettl.textab}

numActivities=1 rootWasReset=false

affinity=com.howettl.textab

intent={act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 cmp=com.howettl.textab/.TexTab}

realActivity=com.howettl.textab/.TexTab

lastActiveTime=4877757 (inactive for 702s)

* Hist #1: ActivityRecord{40a776c8 com.howettl.textab/.TexTab}

    packageName=com.howettl.textab processName=com.howettl.textab

    launchedFromUid=2000 app=ProcessRecord{40bb0098 2995:com.howettl.textab/10104}

    Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 cmp=com.howettl.textab/.TexTab }

    frontOfTask=true task=TaskRecord{40f5c050 #23 A com.howettl.textab}

    taskAffinity=com.howettl.textab

    realActivity=com.howettl.textab/.TexTab

    base=/data/app/com.howettl.textab-1.apk/data/app/com.howettl.textab-1.apk data=/data/data/com.howettl.textab

    labelRes=0x7f060000 icon=0x7f020000 theme=0x0

    stateNotNeeded=false componentSpecified=true isHomeActivity=false

    configuration={ scale=1.0 imsi=0/0 loc=en_CA touch=3 keys=2/1/1 nav=1/2 orien=L layout=0x10000014 uiMode=0x11 seq=6}

    launchFailed=false haveState=true icicle=Bundle[mParcelledData.dataSize=1644]

    state=STOPPED stopped=true delayedResume=false finishing=false

    keysPaused=false inHistory=true visible=false sleeping=true idle=true

    fullscreen=true noDisplay=false immersive=false launchMode=2

    frozenBeforeDestroy=false thumbnailNeeded=false

    connections=[ConnectionRecord{40a76920 com.howettl.textab/.TexTabService:@40b998b8}]

...

Proc #15: adj=prcp /F 40e75070 959:android.process.acore/10006 (provider)

          com.android.providers.contacts/.ContactsProvider2<=Proc{40bb0098 2995:com.howettl.textab/10104}

Proc #16: adj=bak+2/F 40bb0098 2995:com.howettl.textab/10104 (foreground-service)

এগুলি দেখায় যে পরিষেবাটি অগ্রভাগে চলছে।


এই উত্তরটি একবার দেখুন - আপনার জন্য স্ট্যাকওভারফ্লো.com
a/

উত্তর:


223

ওকি ডোকি। আমি জাহান্নামের মধ্য দিয়ে এসেছি এবং এই সমস্যায় ফিরে এসেছি। কীভাবে এগিয়ে যেতে হবে তা এখানে। বাগ আছে। এই পোস্টিংটি কীভাবে বাস্তবায়নে বাগগুলি বিশ্লেষণ করতে এবং সমস্যাগুলি সম্পর্কে কাজ করে তা বর্ণনা করে।

কেবল সংক্ষেপে বলা যায়, জিনিসগুলি কীভাবে কাজ করার কথা। চলমান পরিষেবাদিগুলি প্রতি 30 মিনিট বা তার পরে নিয়মিতভাবে বেয়াদবি এবং সমাপ্ত হবে। এর চেয়ে বেশি সময়ের জন্য বেঁচে থাকতে চায় এমন পরিষেবাগুলিতে অবশ্যই পরিষেবা.স্টার্টফোরগ্রাউন্ড কল করতে হবে, যা বিজ্ঞপ্তি বারে একটি বিজ্ঞপ্তি রাখে, যাতে ব্যবহারকারীরা জানতে পারেন যে আপনার পরিষেবা স্থায়ীভাবে চলছে এবং সম্ভাব্যভাবে ব্যাটারির জীবন চুষছে। কেবলমাত্র 3 টি পরিষেবা প্রক্রিয়া যেকোন সময় তাদেরকে অগ্রভাগের পরিষেবা হিসাবে মনোনীত করতে পারে। যদি তিনটিরও বেশি অগ্রণী পরিষেবাদি থাকে তবে অ্যান্ড্রয়েড পুরানো পরিষেবাটিকে স্ক্যাভেঞ্জিং এবং সমাপ্তির জন্য প্রার্থী হিসাবে মনোনীত করবে।

দুর্ভাগ্যক্রমে, অ্যান্ড্রয়েডে অগ্রণী পরিষেবাগুলি অগ্রাধিকারের ক্ষেত্রে বাগ রয়েছে, যা পরিষেবা বাইন্ডিং পতাকাগুলির বিভিন্ন সংমিশ্রণ দ্বারা ট্রিগার করা হয়। যদিও আপনি নিজের পরিষেবাটিকে অগ্রভাগের পরিষেবা হিসাবে সঠিকভাবে মনোনীত করেছেন, অ্যান্ড্রয়েড যাইহোক আপনার পরিষেবাটি বন্ধ করতে পারে, যদি আপনার প্রক্রিয়াতে পরিষেবার সাথে কোনও সংযোগ কখনও বাধ্যতামূলক পতাকাগুলির নির্দিষ্ট সংমিশ্রণ দ্বারা তৈরি করা হয়ে থাকে। বিস্তারিত নীচে দেওয়া হল।

দ্রষ্টব্য যে খুব কম পরিষেবাগুলির অগ্রভাগ পরিষেবা হওয়া দরকার। সাধারণত, আপনার যদি কেবল কোনও ধরণের ক্রমাগত সক্রিয় বা দীর্ঘ-চলমান ইন্টারনেট সংযোগ থাকে যা চালু এবং বন্ধ করা যায় বা ব্যবহারকারীরা বাতিল করে দেয় তবে আপনার কেবল অগ্রভাগ পরিষেবা হতে হবে। অগ্রাধিকারের স্থিতির প্রয়োজন এমন পরিষেবার উদাহরণ: ইউপিএনপি সার্ভারগুলি, খুব বড় ফাইলগুলির দীর্ঘকালীন চলমান ডাউনলোডগুলি, উই-ফাই দ্বারা ফাইল সিস্টেমগুলিকে সিঙ্ক করতে এবং সঙ্গীত বাজানো।

যদি আপনি কেবল মাঝে মাঝে ভোটদান করেন, বা সিস্টেম ব্রডকাস্ট রিসিভারগুলি বা সিস্টেম ইভেন্টের জন্য অপেক্ষা করছেন, আপনি টাইমার বা আপনার ব্রডকাস্ট রিসিভারের প্রতিক্রিয়ায় আপনার পরিষেবা জাগিয়ে তুলতে আরও ভাল। এটি পরিষেবার জন্য নকশাকৃত আচরণ। আপনার যদি কেবল বেঁচে থাকতেই হয় তবে পড়ুন।

বক্সগুলি সুপরিচিত প্রয়োজনীয়তার (যেমন, সার্ভিস.স্টার্টফোরগ্রাউন্ডে কল করা) বোতামগুলি পরীক্ষা করে দেখার পরের স্থানটি কনটেক্সট.বাইন্ডসোর্সী কলগুলিতে আপনি যে পতাকাগুলি ব্যবহার করছেন তা হ'ল। বাঁধতে ব্যবহৃত পতাকাগুলি বিভিন্ন অপ্রত্যাশিত উপায়ে লক্ষ্য পরিষেবা প্রক্রিয়াটির অগ্রাধিকারকে প্রভাবিত করে। সর্বাধিক বিশেষত, নির্দিষ্ট বাইন্ডিং পতাকা ব্যবহারের ফলে অ্যান্ড্রয়েডকে ভুলভাবে আপনার অগ্রভাগের পরিষেবাটি একটি নিয়মিত পরিষেবাতে ডাউনগ্রেড করতে পারে। প্রক্রিয়া অগ্রাধিকার বরাদ্দ করতে ব্যবহৃত কোডটি বেশ ভারীভাবে মন্থন করা হয়েছে। উল্লেখযোগ্যভাবে, API 14+ এ সংশোধনী রয়েছে যা পুরানো বাইন্ডিং ফ্ল্যাগগুলি ব্যবহার করার সময় বাগের কারণ হতে পারে; এবং 4.2.1 এ নির্দিষ্ট বাগ রয়েছে।

এই সমস্ত ক্ষেত্রে আপনার বন্ধু হ'ল সিসডাম্প ইউটিলিটি, যা ক্রিয়াকলাপ পরিচালক আপনার পরিষেবা প্রক্রিয়াকে কোন অগ্রাধিকার অর্পণ করেছে এবং এটির ক্ষেত্রে কোনও ভুল অগ্রাধিকার দেওয়া হয়েছে তা চিহ্নিত করার জন্য এটি ব্যবহার করা যেতে পারে। আপনার পরিষেবাটি চালু এবং চলমান পান এবং তারপরে আপনার হোস্ট কম্পিউটারে একটি কমান্ড প্রম্পট থেকে নিম্নলিখিত কমান্ডটি জারি করুন:

adb শেল ডাম্পসিস ক্রিয়াকলাপের প্রক্রিয়া> tmp.txt

সামগ্রীগুলি পরীক্ষা করার জন্য নোটপ্যাড (ওয়ার্ডপ্যাড / লিখন নয়) ব্যবহার করুন।

প্রথমটি যাচাই করুন যে আপনি অগ্রভাগ অবস্থায় আপনার পরিষেবা সফলভাবে পরিচালনা করতে পেরেছেন। ডাম্পসিস ফাইলের প্রথম বিভাগে প্রতিটি প্রক্রিয়াটির জন্য ক্রিয়াকলাপ ব্যবস্থাপক বৈশিষ্ট্যগুলির বিবরণ রয়েছে। নীচের মত একটি লাইন অনুসন্ধান করুন যা ডাম্পসিস ফাইলের প্রথম বিভাগে আপনার আবেদনের সাথে মিলে যায়:

অ্যাপ্লিকেশন ইউআইডি 10068 প্রসেসরেকর্ড {41937d40 2205: tunein.service / u0a10068}

নিম্নলিখিত বিভাগে অগ্রভাগ সার্ভিসগুলি = সত্য যাচাই করুন। লুকানো এবং খালি সেটিংস সম্পর্কে চিন্তা করবেন না; তারা প্রক্রিয়াটির ক্রিয়াকলাপের অবস্থা বর্ণনা করে এবং সেগুলির সাথে পরিষেবাগুলির সাথে প্রক্রিয়াগুলির জন্য বিশেষভাবে প্রাসঙ্গিক বলে মনে হয় না। যদি ফোরগ্রাউন্ডসেবাটি সত্য না হয় তবে এটি সত্য করার জন্য আপনাকে পরিষেবা.স্টার্টফোরগ্রাউন্ডে কল করতে হবে।

আপনার পরবর্তী জিনিসটি দেখতে হবে "প্রসেস এলআরইউ তালিকা (oom_adj অনুসারে বাছাই করা):" শিরোনামের ফাইলটির শেষের নিকটবর্তী বিভাগটি। এই তালিকার এন্ট্রিগুলি আপনাকে নির্ধারণ করতে দেয় যে অ্যান্ড্রয়েড আসলে আপনার অ্যাপ্লিকেশনটিকে অগ্রভাগের পরিষেবা হিসাবে শ্রেণিবদ্ধ করেছে কিনা। যদি আপনার প্রক্রিয়া এই তালিকার নীচে থাকে, তবে এটি সংক্ষিপ্ত বিবরণ জন্য প্রধান প্রার্থী। যদি আপনার প্রক্রিয়া তালিকার শীর্ষের কাছাকাছি থাকে তবে এটি কার্যত অবিনাশযোগ্য।

এই টেবিলের একটি লাইন তাকান:

  Proc #31: adj=prcp /FS trm= 0 2205:tunein.service/u0a10068 (fg-service)

এটি পুরোপুরি পরিষেবাটির একটি উদাহরণ যা সবকিছু ঠিকঠাক করেছে। এখানে মূল ক্ষেত্রটি হ'ল "adj =" ক্ষেত্র। এটি আপনার প্রক্রিয়াটি অ্যাক্টিভিটি ম্যানেজার সার্ভিসেস দ্বারা সবকিছু সম্পন্ন হওয়ার পরে নির্ধারিত অগ্রাধিকারটিকে নির্দেশ করে। আপনি এটি "adj = prcp" (দৃশ্যমান অগ্রভাগ পরিষেবা) হতে চান; বা "adj = ভিজ" (কোনও ক্রিয়াকলাপের সাথে দৃশ্যমান প্রক্রিয়া) বা "সামনে" (অগ্রভাগের ক্রিয়াকলাপ সহ প্রক্রিয়া)। যদি এটি "অ্যাড = এসসিসি" (পরিষেবাদি প্রক্রিয়া), বা "অ্যাড = এসসিসিবি" (উত্তরাধিকার পরিষেবা?), বা "অ্যাজড = বাক" (খালি পটভূমি প্রক্রিয়া) থাকে, তবে আপনার প্রক্রিয়াটি সমাপ্তির সম্ভাব্য প্রার্থী, এবং অবসান হবে মেমরি পুনরুদ্ধার করতে কোনও চাপ না থাকলেও প্রতি 30 মিনিটের চেয়ে কম ঘন ঘন ঘন ঘন কম না। লাইনের অবশিষ্ট পতাকাগুলি বেশিরভাগই গুগল ইঞ্জিনিয়ারদের জন্য ডায়াগনস্টিক ডিবাগ তথ্য। সমাপ্তির সিদ্ধান্তগুলি পার্শ্ববর্তী ক্ষেত্রগুলির উপর ভিত্তি করে নেওয়া হয়। সংক্ষেপে, / এফএস একটি অগ্রভাগ পরিষেবা নির্দেশ করে; / এফএ কোনও ক্রিয়াকলাপের সাথে অগ্রভাগ প্রক্রিয়া নির্দেশ করে indicates / বি একটি পটভূমি পরিষেবা নির্দেশ করে। শেষে লেবেলটি সাধারণ নিয়মকে নির্দেশ করে যার অধীনে প্রক্রিয়াটিকে একটি অগ্রাধিকার অর্পণ করা হয়েছিল। সাধারণত এটি adj = ক্ষেত্রের সাথে মিলিত হওয়া উচিত; তবে অন্যান্য পরিষেবাদি বা ক্রিয়াকলাপের সাথে সক্রিয় বাঁধাইয়ের জন্য পতাকা বাঁধনের কারণে কিছু ক্ষেত্রে অ্যাডওয়্যার = মানটি উপরের বা নীচের দিকে সামঞ্জস্য করা যেতে পারে।

আপনি যদি কোনও বাঁধাই পতাকা সহ একটি বাগের উপর দিয়ে ট্রিপ করে ফেলেছেন তবে ডাম্পস লাইনটি দেখতে এটি দেখতে পাবেন:

  Proc #31: adj=bak /FS trm= 0 2205:tunein.service/u0a10068 (fg-service)

নোট ক্ষেত্রটির মান কীভাবে ভুলভাবে "adj = বাক" (খালি ব্যাকগ্রাউন্ড প্রক্রিয়া) এ সেট করা আছে তা নোট করুন, যা প্রক্রিয়া বিচ্ছুরণের উদ্দেশ্যে "দয়া করে আমাকে এখনই শেষ করুন যাতে আমি এই অর্থহীন অস্তিত্ব শেষ করতে পারি" to লাইনটির শেষে (fg-service) পতাকাটিও নোট করুন যা নির্দেশ করে যে "ভুলে যাওয়া পরিষেবা নিয়মগুলি" অ্যাজড "সেটিংস নির্ধারণ করতে ব্যবহৃত হয়েছিল। fg-পরিষেবাদি বিধি ব্যবহৃত হয়েছিল সত্ত্বেও, এই প্রক্রিয়াটি একটি অ্যাডেজ সেটিং বরাদ্দ করা হয়েছিল "বক", এবং এটি বেশি দিন বাঁচবে না Pla সহজভাবে বলতে গেলে এটি একটি বাগ।

সুতরাং লক্ষ্যটি হ'ল আপনার প্রক্রিয়া সর্বদা "adj = prcp" (বা আরও ভাল) হয় তা নিশ্চিত করা। এবং এই লক্ষ্য অর্জনের জন্য পদ্ধতিটি হ'ল বাঁধাকৃত পতাকাগুলিকে টুইঙ্ক করা যতক্ষণ না আপনি অগ্রাধিকারের কার্যভারে বাগগুলি এড়ানোর ব্যবস্থা না করেন।

আমি যে বাগগুলি জানি সেগুলি এখানে। (1) যদি কোনও পরিষেবা বা ক্রিয়াকলাপ প্রাসঙ্গিক ব্যবহার করে সেবার সাথে কখনও আবদ্ধ হয়ে থাকে BI বি। এ। বি। এ। এ। বি। এ। এটি বিশেষত সত্য যদি আপনার যদি পরিষেবার মধ্যেও বাইন্ডিং থাকে। 4.2.1 উত্সগুলিতে একটি স্পষ্ট বাগ g (২) পরিষেবা-পরিষেবা-বাঁধাইয়ের জন্য অবশ্যই BIND_ABOVE_CLIENT কখনই ব্যবহার করবেন না। কার্যকলাপ-থেকে-পরিষেবা সংযোগের জন্য এটি ব্যবহার করবেন না। BIND_ABOVE_CLIENT আচরণ বাস্তবায়নের জন্য ব্যবহৃত পতাকাটি প্রতি সংযোগ ভিত্তির পরিবর্তে প্রতি-প্রক্রিয়া ভিত্তিতে সেট করা মনে হয়, সুতরাং এটি কোনও সক্রিয় ক্রিয়াকলাপ-থেকে-পরিষেবাতে না থাকলেও পরিষেবা-থেকে-পরিষেবা বাইন্ডিং সহ বাগগুলি ট্রিগার করে পতাকা সেট সঙ্গে বাঁধাই। প্রক্রিয়াটিতে পরিষেবা-থেকে-পরিষেবা বাইন্ডিংয়ের সাথে একাধিক পরিষেবা থাকলে অগ্রাধিকার প্রতিষ্ঠায় সমস্যা রয়েছে বলে মনে হয়। পরিষেবা-থেকে-পরিষেবা বাইন্ডিংগুলিতে কনটেক্সট.বি.আই.বি.উইউবিআইপিআরআইআরআই (এপিআই 14) ব্যবহার করা সহায়তা বলে মনে হচ্ছে। প্রসঙ্গ.বি.আই.আইআইআইআইএমআইআইএমআইপিটিটিকে কোনও ক্রিয়াকলাপ থেকে কোনও পরিষেবায় বাধ্যতামূলক করার সময় আরও কম বা কম ধারণা বলে মনে হয়। ক্রিয়াকলাপটি যখন থামানো বা সমাপ্ত হয় তখন কোনও আপত্তিজনক ক্ষতি না করেই কার্যকলাপটি অগ্রভাগে থাকা অবস্থায় আপনার প্রক্রিয়াটির অগ্রাধিকারটিকে এক দশমিক উচ্চতর বাধা দেয়।

তবে সামগ্রিকভাবে, কৌশলটি হ'ল সাইনডাম্পটি নির্দেশ করে যে আপনার প্রক্রিয়াটি সঠিক অগ্রাধিকার প্রাপ্ত না হওয়া পর্যন্ত আপনার বাইন্ডসাইজার পতাকাগুলি সামঞ্জস্য করা।

আমার উদ্দেশ্যগুলির জন্য, প্রসঙ্গটি ব্যবহার করুন BI বিবিND_AUTO_CREATE | প্রযোজনা-পরিষেবা-পরিষেবা বাইন্ডিংগুলি এবং প্রসঙ্গের জন্য প্রসঙ্গ.বি.আই.আইআইআইআইএমআইএমআইটি। প্রসঙ্গ। বিবিND_WAIVE_PRIORITY পরিষেবা থেকে পরিষেবা বাইন্ডিংয়ের জন্য সঠিক কাজটি মনে হচ্ছে। আপনার মাইলেজ পৃথক হতে পারে।

আমার অ্যাপটি মোটামুটি জটিল: দুটি ব্যাকগ্রাউন্ড পরিষেবা, যার প্রতিটি স্বতন্ত্রভাবে অগ্রভাগের পরিষেবাগুলির রাজ্যগুলি ধরে রাখতে পারে, তৃতীয়টি তৃতীয়টি যা অগ্রভাগের পরিষেবা রাষ্ট্র গ্রহণ করতে পারে; দুটি পরিষেবা শর্তাধীন একে অপরের সাথে আবদ্ধ; তৃতীয়টি সর্বদা প্রথমটিকে আবদ্ধ করে। এছাড়াও, অ্যাক্টিভিটগুলি একটি পৃথক প্রক্রিয়াতে চালিত হয় (অ্যানিমেশনটিকে মসৃণ করে তোলে)। একই প্রক্রিয়াতে ক্রিয়াকলাপ এবং পরিষেবাদি চালানো কোনও তাত্পর্যপূর্ণ বলে মনে হয় না।

স্ক্যাভেঞ্জিং প্রক্রিয়াগুলির জন্য নিয়মের প্রয়োগকরণ, (এবং সিস্টডাম্প ফাইলগুলির বিষয়বস্তু উত্পন্ন করতে উত্স কোড ব্যবহৃত হয়) মূল অ্যান্ড্রয়েড ফাইলে পাওয়া যাবে

frameworks\base\services\java\com\android\server\am\ActivityManagerService.java.

খারাপ সুযোগ.

পিএস: অ্যান্ড্রয়েড 5.0 এর জন্য সিসডাম্প স্ট্রিংয়ের ব্যাখ্যা এখানে। আমি তাদের সাথে কাজ করি নি, তাই আপনি যা চান তা তৈরি করুন। আমি বিশ্বাস করি যে আপনি 4 টি 'এ' বা 'এস', এবং 5 টি "আইএফ" বা "আইবি" হতে চান এবং 1 টি যতটা সম্ভব কম হতে হবে (সম্ভবত 3 এর নিচে, যেহেতু কেবলমাত্র তিনটি অগ্রভাগের পরিষেবা প্রক্রিয়া সক্রিয় রয়েছে ডিফল্ট কনফিগারেশন)।

Example:
   Proc # : prcp  F/S/IF trm: 0 31719: neirotech.cerebrum.attention:blePrcs/u0a77 (fg-service)

Format:
   Proc # {1}: {2}  {3}/{4}/{5} trm: {6} {7}: {8}/{9} ({10}

1: Order in list: lower is less likely to get trimmed.

2: Not sure.

3:
    B: Process.THREAD_GROUP_BG_NONINTERACTIVE
    F: Process.THREAD_GROUP_DEFAULT

4:
    A: Foreground Activity
    S: Foreground Service
    ' ': Other.

5:
    -1: procState = "N ";
        ActivityManager.PROCESS_STATE_PERSISTENT: procState = "P ";
    ActivityManager.PROCESS_STATE_PERSISTENT_UI:procState = "PU";
    ActivityManager.PROCESS_STATE_TOP: procState = "T ";
    ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND: procState = "IF";
    ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND: procState = "IB";
    ActivityManager.PROCESS_STATE_BACKUP:procState = "BU";
    ActivityManager.PROCESS_STATE_HEAVY_WEIGHT: procState = "HW";
    ActivityManager.PROCESS_STATE_SERVICE: procState = "S ";
    ActivityManager.PROCESS_STATE_RECEIVER: procState = "R ";
    ActivityManager.PROCESS_STATE_HOME: procState = "HO";
    ActivityManager.PROCESS_STATE_LAST_ACTIVITY: procState = "LA";
    ActivityManager.PROCESS_STATE_CACHED_ACTIVITY: procState = "CA";
    ActivityManager.PROCESS_STATE_CACHED_ACTIVITY_CLIENT: procState = "Ca";
    ActivityManager.PROCESS_STATE_CACHED_EMPTY: procState = "CE";

{6}: trimMemoryLevel

{8} Process ID.
{9} process name
{10} appUid 

4
@ রবিন ডেভিস, আমার ছোট প্রশ্ন আছে। bindService()যদি আমার ক্রমাগত পরিষেবা চালানো দরকার হয় তবে আমার কি সত্যিই কল করা উচিত? কেবল startForeground()পরিষেবাতে কল করা কি যথেষ্ট নয় ? সার্ভারের সাথে যোগাযোগের জন্য আমি ইভেন্টবাস ব্যবহার করছি।
আর-জি

পরিষেবাটি প্রথম স্থানে চলার জন্য আপনি একটি ক্রিয়াকলাপ থেকে কনটেক্সট.বাইন্ডসেবার কল করেন। সার্ভিস.স্টার্ট সার্ভিস পদ্ধতিটি পরিষেবাটিকে কোড দ্বারা কল করা হয় যাতে পরিষেবাটি "অগ্রভাগ" অবস্থায় শুরু করা হয়েছে move আমি ধরে নেব যে ইভেন্টবাস লাইব্রেরিটি পরিষেবাটি শুরু করার জন্য আপনার পক্ষ থেকে কনটেক্সট.বাইন্ডসোসাইরিটিকে কল করছে। কোনও পরিষেবা শুরু করার অন্য কোনও উপায় থাকলে আমি এর সাথে পরিচিত নই।
রবিন ডেভিস

4
দুর্দান্ত পোস্ট! উত্সাহিত। আমি এই মন্তব্যটিতে একটি অংশ যোগ করতে চেয়েছিলাম, যা আমি বিশ্বাস করি এটি প্রাসঙ্গিক। আপনি যদি ক্রমাগত চলমান পরিষেবা চান, যেমন রবিন উল্লেখ করেছেন আপনাকে এটিকে কোনওভাবে শুরু করা দরকার। বিন্যাস সার্ভিস () এর পরিবর্তে সরাসরি আপনার ক্রিয়াকলাপের মধ্যেই স্টার্ট সার্ভিস (ইনটেন্ট সার্ভিস) কল করা সম্ভব এবং তারপরে আপনার পরিষেবাটি শুরু হয়ে গেলে আপনি স্টার্টফোরগ্রাউন্ড () পদ্ধতিতে কল করতে পারেন। আমি এই পরিষেবা ক্লাসের onStartCommand () এ কল করি। যতদূর আমি সচেতন, এটি আপনার পরিষেবাদিটিকে আবদ্ধ না করে তৈরি করতে হবে, তবে এটিকে পন্ডিত রিসোর্সের সমস্যাগুলিতে চলতে থাকবে। আশা করি এটি কাউকে সাহায্য করবে।
ডেভ

মহান কাজ!! আমি এটিতে একটি আপডেট যুক্ত করতে চাই। প্রথমে অ্যাডবির আউটপুট ফর্ম্যাটটি কিছুটা পরিবর্তিত হয়েছে (জানুয়ারী 2016) আমি এই প্রক্রিয়াটি দুটি ডিভাইস এলজি ভোল্ট 4.4.2 এবং নেক্সাস 5x 6.0.1 এ পরীক্ষা করেছি both উভয় ডিভাইস এখনও ত্রুটিযুক্ত। আমি কেবল কনটেক্সট ব্যবহার করেই সমস্যাটি পুনরুত্পাদন করতে পারি BI বি.আই. ক্রিয়াকলাপের বাইরে যাওয়ার পরে ডিভাইস। অন্যান্য সমস্ত পতাকা অ্যান্ড্রয়েড সংস্করণ উভয়ই ঠিক আছে বলে মনে হচ্ছে।
ব্যবহারকারী3259330

4
@ ডেভ ওহে ডেভ, আমি ঠিক সেই পদ্ধতিটি ব্যবহার করি, পাশাপাশি ফিরে আসছি START_STICKY, তবে আমার পরিষেবা সর্বদা এক ঘণ্টা বা তার পরে মারা যায় যখন ডিভাইসটি নিষ্ক্রিয় থাকে। কী চলছে সে সম্পর্কে আপনার কোনও ধারণা আছে
রুচির বারোনিয়া

7

যদি এটি "আর চাই না ..." বলছে তবে সেই প্রক্রিয়াটিতে কোনও পরিষেবা সক্রিয় নেই যা বর্তমানে স্টার্টফোরগ্রাউন্ড () অবস্থায় রয়েছে। এটিতে আপনার কলটি সফল হচ্ছে কিনা তা পরীক্ষা করে দেখুন - আপনি যে বিজ্ঞপ্তি পোস্ট করেছেন তা দেখতে পাচ্ছেন, লগতে কোনও বার্তা নেই যে কোনও বিষয়ে অভিযোগ করছে ইত্যাদি। এছাড়াও "অ্যাডাব শেল ডাম্পস ক্রিয়াকলাপ পরিষেবা" ব্যবহার করুন আপনার পরিষেবার স্থিতি এবং নিশ্চিত করুন যে এটি প্রকৃতপক্ষে অগ্রভাগ হিসাবে চিহ্নিত হয়েছে। এছাড়াও যদি এটি সঠিকভাবে সম্মুখভূমি হয় তবে "অ্যাডবি শেল ডাম্পসিস ক্রিয়াকলাপ" এর আউটপুটে আপনি সেই বিভাগে দেখতে পাবেন যে OOM সংক্রমিকাগুলি প্রসেসগুলি সংযুক্ত করে যে সেই পরিষেবাটির কারণে আপনার প্রক্রিয়াটি বর্তমানে অগ্রগ্রহ স্তরে রয়েছে।


সাহায্য করার জন্যে ধন্যবাদ! আপনার উল্লেখ করা কমান্ডগুলির ফলাফল দিয়ে আমি আমার প্রশ্ন সম্পাদনা করেছি। তারা মনে করে যে পরিষেবাটি অগ্রভাগে চলছে।
হোয়েটল

আমি পোস্ট করতে পারি এমন কোডের এমন কোনও বিভাগ রয়েছে যা নির্ণয়ে সহায়তা করতে পারে?
হোয়েটল

4
অগ্রভাগে থাকাকালীন এটি অবশ্যই হত্যা করা উচিত নয় এবং আমি নিশ্চিতভাবে জানি যে স্ট্যান্ডার্ড প্ল্যাটফর্মের সংগীতের মতো জিনিসগুলি নয় not সমস্যাটি পুনরুত্পাদন করতে কোড সহ একটি বাগ ফাইল করার বিষয়টি বিবেচনা করুন। একটি বিষয় লক্ষ্যণীয় হ'ল যদি আপনি কোনও বিন্দুতে অগ্রভাগের বাইরে এবং বাইরে চলে যাচ্ছেন যা একে হত্যা করার অনুমতি দিতে পারে।
হ্যাকবড

4
এটা কি সম্ভব যে সূচনাপৃষ্ঠা () আবার কল করার পরিবর্তে বিজ্ঞপ্তি () কে কল করে চলমান বিজ্ঞপ্তিটি আপডেট করা এটিকে অগ্রভাগের স্থিতির বাইরে নিয়ে যেতে পারে? যদি বিষয়টি বিবেচিত হয় তবে আমি বিজ্ঞপ্তিতে FLAG_ALERT_ONLY_ONCE সক্ষমও করেছি CE
হোয়েটল

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