একটি পটভূমি টাস্ক বা পরিষেবা থেকে বর্তমান অগ্রভাগ অ্যাপ্লিকেশন নির্ধারণ করা


112

আমি ব্যাকগ্রাউন্ডে চলমান একটি অ্যাপ্লিকেশন চাই, যা অন্তর্নির্মিত অ্যাপ্লিকেশনগুলির (মেসেজিং, পরিচিতিগুলি, ইত্যাদি) কখন চলছে তা জানে।

সুতরাং আমার প্রশ্নগুলি হ'ল:

  1. আমার অ্যাপ্লিকেশনটি কীভাবে পটভূমিতে চালানো উচিত।

  2. আমার পটভূমি অ্যাপ্লিকেশনটি কীভাবে জানতে পারে যে বর্তমানে অগ্রভাগে চলমান অ্যাপ্লিকেশনটি কী।

অভিজ্ঞতার সাথে ভাবেনদের প্রতিক্রিয়াগুলি প্রশংসিত হবে।


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


1
অগ্রভাগ অ্যাপটি সনাক্তকরণের জন্য, আপনি github.com/ricvalerio/foregroundappchecker
rvalerio

উত্তর:


104

"২" এর সাথে শ্রদ্ধা সহ আমার পটভূমি অ্যাপ্লিকেশনটি কীভাবে জানতে পারে যে বর্তমানে অগ্রভাগে চলমান অ্যাপ্লিকেশনটি কী। "

getRunningAppProcesses()পদ্ধতিটি ব্যবহার করবেন না কারণ এটি আমার অভিজ্ঞতা থেকে সমস্ত ধরণের সিস্টেমের আবর্জনা ফিরিয়ে দেয় এবং আপনি একাধিক ফলাফল পাবেন RunningAppProcessInfo.IMPORTANCE_FOREGROUNDgetRunningTasks()পরিবর্তে ব্যবহার করুন

আমার পূর্বপরিবর্তিত অ্যাপ্লিকেশনটি সনাক্ত করার জন্য আমি আমার পরিষেবাতে এই কোডটি ব্যবহার করি এটি সত্যই সহজ:

ActivityManager am = (ActivityManager) AppService.this.getSystemService(ACTIVITY_SERVICE);
// The first in the list of RunningTasks is always the foreground task.
RunningTaskInfo foregroundTaskInfo = am.getRunningTasks(1).get(0);

এটি হ'ল, তারপরে আপনি সহজেই অগ্রভাগের অ্যাপ্লিকেশন / ক্রিয়াকলাপের বিশদটি অ্যাক্সেস করতে পারবেন:

String foregroundTaskPackageName = foregroundTaskInfo .topActivity.getPackageName();
PackageManager pm = AppService.this.getPackageManager();
PackageInfo foregroundAppPackageInfo = pm.getPackageInfo(foregroundTaskPackageName, 0);
String foregroundTaskAppName = foregroundAppPackageInfo.applicationInfo.loadLabel(pm).toString();

ক্রিয়াকলাপের প্রকাশের জন্য এটির অতিরিক্ত অনুমতি প্রয়োজন এবং পুরোপুরি কাজ করে।

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

1
এটি সঠিক উত্তর হিসাবে চিহ্নিত করা উচিত। প্রয়োজনীয় অনুমতি: android.permission.GET_TASKS অন্যান্য পদ্ধতির একমাত্র খুব সামান্যতম দিক যা এড়াতে পারে।
ব্র্যান্ডল

3
উপরের সম্পাদনা করুন: দ্রষ্টব্য: এই পদ্ধতিটি কেবলমাত্র ডিবাগিং এবং টাস্ক ম্যানেজমেন্ট ব্যবহারকারী ইন্টারফেস উপস্থাপনের জন্য তৈরি। <- সবেমাত্র এটি জাভা ডকটিতে প্রদর্শিত হয়েছে। সুতরাং এই পদ্ধতিটি ভবিষ্যতে কোনও বিজ্ঞপ্তি ছাড়াই পরিবর্তিত হতে পারে।
ব্র্যান্ডল

47
নোট: getRunningTasks()API এ অবচিত 21 (Lollipop এ) - developer.android.com/reference/android/app/...
dtyler

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


38

আমি সঠিকভাবে সঠিক সমাধানটি বের করতে হয়েছিল। নীচের কোডটি সায়ানোজেনমোড 7 (ট্যাবলেটের টুইটগুলি) এর একটি অংশ এবং অ্যান্ড্রয়েড 2.3.3 / জিঞ্জারব্রেডে পরীক্ষা করা হয়েছে।

পদ্ধতি:

  • getForegroundApp - অগ্রভাগ অ্যাপ্লিকেশন প্রদান করে।
  • getActivityForApp - পাওয়া অ্যাপ্লিকেশনটির ক্রিয়াকলাপ প্রদান করে।
  • #StillActive - পূর্ববর্তী পাওয়া অ্যাপ্লিকেশনটি এখনও সক্রিয় অ্যাপ্লিকেশন কিনা তা নির্ধারণ করে।
  • isRunningService - getForegroundApp এর জন্য একটি সহায়ক ফাংশন

আশা করি এই সমস্যাটির উত্তরটি সমস্ত ক্ষেত্রেই প্রসারিত হবে (:

private RunningAppProcessInfo getForegroundApp() {
    RunningAppProcessInfo result=null, info=null;

    if(mActivityManager==null)
        mActivityManager = (ActivityManager)mContext.getSystemService(Context.ACTIVITY_SERVICE);
    List <RunningAppProcessInfo> l = mActivityManager.getRunningAppProcesses();
    Iterator <RunningAppProcessInfo> i = l.iterator();
    while(i.hasNext()){
        info = i.next();
        if(info.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND
                && !isRunningService(info.processName)){
            result=info;
            break;
        }
    }
    return result;
}

private ComponentName getActivityForApp(RunningAppProcessInfo target){
    ComponentName result=null;
    ActivityManager.RunningTaskInfo info;

    if(target==null)
        return null;

    if(mActivityManager==null)
        mActivityManager = (ActivityManager)mContext.getSystemService(Context.ACTIVITY_SERVICE);
    List <ActivityManager.RunningTaskInfo> l = mActivityManager.getRunningTasks(9999);
    Iterator <ActivityManager.RunningTaskInfo> i = l.iterator();

    while(i.hasNext()){
        info=i.next();
        if(info.baseActivity.getPackageName().equals(target.processName)){
            result=info.topActivity;
            break;
        }
    }

    return result;
}

private boolean isStillActive(RunningAppProcessInfo process, ComponentName activity)
{
    // activity can be null in cases, where one app starts another. for example, astro
    // starting rock player when a move file was clicked. we dont have an activity then,
    // but the package exits as soon as back is hit. so we can ignore the activity
    // in this case
    if(process==null)
        return false;

    RunningAppProcessInfo currentFg=getForegroundApp();
    ComponentName currentActivity=getActivityForApp(currentFg);

    if(currentFg!=null && currentFg.processName.equals(process.processName) &&
            (activity==null || currentActivity.compareTo(activity)==0))
        return true;

    Slog.i(TAG, "isStillActive returns false - CallerProcess: " + process.processName + " CurrentProcess: "
            + (currentFg==null ? "null" : currentFg.processName) + " CallerActivity:" + (activity==null ? "null" : activity.toString())
            + " CurrentActivity: " + (currentActivity==null ? "null" : currentActivity.toString()));
    return false;
}

private boolean isRunningService(String processname){
    if(processname==null || processname.isEmpty())
        return false;

    RunningServiceInfo service;

    if(mActivityManager==null)
        mActivityManager = (ActivityManager)mContext.getSystemService(Context.ACTIVITY_SERVICE);
    List <RunningServiceInfo> l = mActivityManager.getRunningServices(9999);
    Iterator <RunningServiceInfo> i = l.iterator();
    while(i.hasNext()){
        service = i.next();
        if(service.process.equals(processname))
            return true;
    }

    return false;
}

1
আপনি যদি আমাকে জিজ্ঞাসা করতে আপত্তি করেন না, তবে এটি পরিষেবা চালাচ্ছে কিনা, এখনও সক্রিয় রয়েছে এবং কেবল অগ্রভাগের অ্যাপ্লিকেশনটি পেতে ক্রিয়াকলাপটি পেতে কেন আপনার প্রয়োজনীয় পদ্ধতির প্রয়োজন হবে?

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

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

কেউ কি জানেন কী এই পদ্ধতিটি সহজভাবে করার চেয়ে ভাল mActivityManager.getRunningTasks(1).get(0).topActivity?
স্যাম

35

নিম্নলিখিত কোড ব্যবহার করে দেখুন:

ActivityManager activityManager = (ActivityManager) newContext.getSystemService( Context.ACTIVITY_SERVICE );
List<RunningAppProcessInfo> appProcesses = activityManager.getRunningAppProcesses();
for(RunningAppProcessInfo appProcess : appProcesses){
    if(appProcess.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND){
        Log.i("Foreground App", appProcess.processName);
    }
}

প্রক্রিয়া নামটি অগ্রভাগে চলমান অ্যাপের প্যাকেজের নাম। এটি আপনার অ্যাপ্লিকেশনের প্যাকেজের নামের সাথে তুলনা করুন। যদি এটি একই হয় তবে আপনার অ্যাপ্লিকেশনটি অগ্রভাগে চলছে।

আমি আশা করি এটি আপনার প্রশ্নের উত্তর দেয়।


7
অ্যান্ড্রয়েড সংস্করণ এল থেকে পরবর্তীকালে, এটিই একমাত্র সমাধান যা অন্যান্য সমাধানগুলিতে ব্যবহৃত পদ্ধতি হ্রাস পেয়েছে বলে কাজ করে।
অ্যান্ড্রয়েডগুই

4
যাইহোক, অ্যাপ্লিকেশনটি অগ্রভাগে রয়েছে এবং স্ক্রীনটি লক হয়ে থাকলে এটি কাজ করছে না
ক্রিট

সঠিক উত্তরটি টিক করা উচিত
A_rmas

1
গৃহীত উত্তরের মতো এটির কি অতিরিক্ত অনুমতি দরকার?
ওয়ানসুক

1
এটি পুরোপুরি সঠিক নয়। কোনও প্রক্রিয়ার নাম সর্বদা সংশ্লিষ্ট অ্যাপ্লিকেশন প্যাকেজের নামের মতো হয় না।
স্যাম

25

ললিপপ থেকে পরবর্তীকালে এটি বদলে গেল। ব্যবহারকারীর অ্যাক্সেস সহ অ্যাপ্লিকেশনগুলিতে -> ব্যবহারকারীর সেটিংস -> সুরক্ষা -> যেতে হবে তার আগে দয়া করে নীচের কোডটি সন্ধান করুন -> আমাদের অ্যাপ্লিকেশনকে অনুমতি দিন

private void printForegroundTask() {
    String currentApp = "NULL";
    if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
        UsageStatsManager usm = (UsageStatsManager) this.getSystemService(Context.USAGE_STATS_SERVICE);
        long time = System.currentTimeMillis();
        List<UsageStats> appList = usm.queryUsageStats(UsageStatsManager.INTERVAL_DAILY,  time - 1000*1000, time);
        if (appList != null && appList.size() > 0) {
            SortedMap<Long, UsageStats> mySortedMap = new TreeMap<Long, UsageStats>();
            for (UsageStats usageStats : appList) {
                mySortedMap.put(usageStats.getLastTimeUsed(), usageStats);
            }
            if (mySortedMap != null && !mySortedMap.isEmpty()) {
                currentApp = mySortedMap.get(mySortedMap.lastKey()).getPackageName();
            }
        }
    } else {
        ActivityManager am = (ActivityManager)this.getSystemService(Context.ACTIVITY_SERVICE);
        List<ActivityManager.RunningAppProcessInfo> tasks = am.getRunningAppProcesses();
        currentApp = tasks.get(0).processName;
    }

    Log.e(TAG, "Current App in foreground is: " + currentApp);
}

1
এই ব্যবহারের পরিসংখ্যান প্রোগ্রামযুক্ত সেট করা যায় না?
রুবমজ

@rubmz আপনি কি এই বিষয়ে কোন সমাধান পেয়েছেন?
ভিভিবি

1
অ্যান্ড্রয়েড 5.1 এর সাথে আমার ডুজে কোনও বিকল্প নেই "আমাদের অ্যাপ্লিকেশনটিকে অনুমতি দিন"
ডিজেড্যান্স

এটি 100% সঠিক ফলাফল দেয় না ... এটি বেশিরভাগ সময় ঠিক থাকে
ক্যামহার্ট

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

9

ক্ষেত্রে যখন আমাদের নিজস্ব পরিষেবা / ব্যাকগ্রাউন্ড-থ্রেড থেকে আমাদের অ্যাপটি অগ্রভাগে আছে কিনা তা পরীক্ষা করা দরকার। এইভাবেই আমি এটি প্রয়োগ করেছি এবং এটি আমার পক্ষে ভাল কাজ করে:

public class TestApplication extends Application implements Application.ActivityLifecycleCallbacks {

    public static WeakReference<Activity> foregroundActivityRef = null;

    @Override
    public void onActivityStarted(Activity activity) {
        foregroundActivityRef = new WeakReference<>(activity);
    }

    @Override
    public void onActivityStopped(Activity activity) {
        if (foregroundActivityRef != null && foregroundActivityRef.get() == activity) {
            foregroundActivityRef = null;
        }
    }

    // IMPLEMENT OTHER CALLBACK METHODS
}

এখন অন্যান্য ক্লাস থেকে পরীক্ষা করতে, অ্যাপটি অগ্রভাগে রয়েছে কি না, কেবল কল করুন:

if(TestApplication.foregroundActivityRef!=null){
    // APP IS IN FOREGROUND!
    // We can also get the activity that is currently visible!
}

আপডেট ( এসএইচএস দ্বারা চিহ্নিত হিসাবে ):

আপনার অ্যাপ্লিকেশন শ্রেণির onCreateপদ্ধতিতে কলব্যাকগুলির জন্য নিবন্ধন করতে ভুলবেন না ।

@Override
public void onCreate() {
    ...
    registerActivityLifecycleCallbacks(this);
}

2
গত দু' ঘন্টা ধরে আমি এটির সন্ধান করছিলাম। ধন্যবাদ! :)
ওয়াসিফখত্তর

1
আমাদের কল করতে হবে "রেজিস্টারঅ্যাক্টিভিটি লাইফেসাইকেলক্যালব্যাকস (এটি);" অ্যাপ্লিকেশন শ্রেণির (টেস্ট অ্যাপ্লিকেশন) এর "ওয়ানক্রিট ()" ওভাররাইড পদ্ধতিতে। এটি আমাদের অ্যাপ্লিকেশন শ্রেণিতে কলব্যাকগুলি শুরু করবে।
এসএইচএস

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

@ আইয়াজ আলিফভ যদি ফোন স্ট্যান্ডবাইতে থাকে বা ফোনটি লক থাকে তবে আমি এটিকে অগ্রভাগে বিবেচনা করব না, তবে এটি আবার অগ্রাধিকারের উপর নির্ভর করে।
সার্থক মিত্তাল

8

অগ্রভূমি অ্যাপ্লিকেশন নির্ধারণ করতে, আপনি অগ্রভাগ অ্যাপটি সনাক্ত করার জন্য ব্যবহার করতে পারেন, আপনি https://github.com/ricvalerio/foregroundappchecker ব্যবহার করতে পারেন । এটি ডিভাইসের অ্যান্ড্রয়েড সংস্করণের উপর নির্ভর করে বিভিন্ন পদ্ধতি ব্যবহার করে।

পরিষেবা হিসাবে, রেপো আপনার জন্য প্রয়োজনীয় কোড সরবরাহ করে। মূলত, অ্যান্ড্রয়েড স্টুডিওতে আপনার জন্য পরিষেবাটি তৈরি করা যাক এবং তারপরে অনক্রিট অ্যাপচিচার ব্যবহার করে এমন স্নিপেট যুক্ত করুন। তবে আপনাকে অনুমতি চাইতে হবে।


নিখুঁত !! অ্যান্ড্রয়েড 7
প্রতীক ট্যাঙ্ক

অনেক ধন্যবাদ. এটিই একমাত্র উত্তর যা অ্যাপ্লিকেশনগুলির বিজ্ঞপ্তিগুলির সাথে আমরা যে সমস্যার মুখোমুখি হয়েছি solved যখন কোনও বিজ্ঞপ্তি পপ আপ হয়, অন্য সমস্ত উত্তরগুলি অ্যাপ্লিকেশনটির প্যাকেজের নামটি দেয় যা বিজ্ঞপ্তিটি পাঠিয়েছে। আপনার ললিপপডেক্টর এই সমস্যার সমাধান করেছে। একটি ইঙ্গিত: এপিআই 29 থেকে, MOVE_TO_FOREGROUND ইউসেজএভেন্টস-এ হ্রাস করা হয়েছে vent তাহলে এটি কবজির মতো কাজ করবে!
জর্ন রিগটার

8

অবহেলিত getRunningTasks()এবং getRunningAppProcesses()নির্ভরযোগ্য নয় এমন অ্যাকাউন্ট গ্রহণ করে আমি স্ট্যাকওভারফ্লোতে উল্লিখিত 2 টি পদ্ধতির একত্রিত করার সিদ্ধান্ত নিয়েছিলাম:

   private boolean isAppInForeground(Context context)
    {
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP)
        {
            ActivityManager am = (ActivityManager) context.getSystemService(ACTIVITY_SERVICE);
            ActivityManager.RunningTaskInfo foregroundTaskInfo = am.getRunningTasks(1).get(0);
            String foregroundTaskPackageName = foregroundTaskInfo.topActivity.getPackageName();

            return foregroundTaskPackageName.toLowerCase().equals(context.getPackageName().toLowerCase());
        }
        else
        {
            ActivityManager.RunningAppProcessInfo appProcessInfo = new ActivityManager.RunningAppProcessInfo();
            ActivityManager.getMyMemoryState(appProcessInfo);
            if (appProcessInfo.importance == IMPORTANCE_FOREGROUND || appProcessInfo.importance == IMPORTANCE_VISIBLE)
            {
                return true;
            }

            KeyguardManager km = (KeyguardManager) context.getSystemService(Context.KEYGUARD_SERVICE);
            // App is foreground, but screen is locked, so show notification
            return km.inKeyguardRestrictedInputMode();
        }
    }

4
আপনাকে ম্যানিফেস্টে
অবহেলিত

1
android.permission.GET_TASKS - বর্তমানে প্লে স্টোরে নিষিদ্ধ
দুনা


1

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

ActivityManager activityManager = (ActivityManager) context.getSystemService( Context.ACTIVITY_SERVICE );
                PackageManager pm = context.getPackageManager();
                List<RunningAppProcessInfo> appProcesses = activityManager.getRunningAppProcesses();
                for(RunningAppProcessInfo appProcess : appProcesses) {              
                    if(appProcess.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
                        CharSequence c = pm.getApplicationLabel(pm.getApplicationInfo(appProcess.processName, PackageManager.GET_META_DATA));
                        Log.i("Foreground App", "package: " + appProcess.processName + " App: " + c.toString());
                    }               
                }

4
আমি মনে করি এটি কেবল তখনই কাজ করে যদি আপনার নিজস্ব অ্যাপটি অগ্রভাগে চলছে। যখন অন্য কোনও অ্যাপ্লিকেশন সম্মুখের দিকে থাকে তখন এটি কিছুই জানায় না।
অ্যালিস ভ্যান ডের ল্যান্ড

0

এরকম কিছু করুন:

int showLimit = 20;

/* Get all Tasks available (with limit set). */
ActivityManager mgr = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.RunningTaskInfo> allTasks = mgr.getRunningTasks(showLimit);
/* Loop through all tasks returned. */
for (ActivityManager.RunningTaskInfo aTask : allTasks) 
{                  
    Log.i("MyApp", "Task: " + aTask.baseActivity.getClassName()); 
    if (aTask.baseActivity.getClassName().equals("com.android.email.activity.MessageList")) 
        running=true;
}

গুগল সম্ভবত এমন একটি অ্যাপ্লিকেশন প্রত্যাখ্যান করবে যা অ্যাক্টিভিটি ম্যানেজ.আরজিটরুনিংটাস্ক () ব্যবহার করে। ডকুমেন্টেশন রাজ্যের এটা যে শত্রু দেব উদ্দেশ্যে শুধুমাত্র: developer.android.com/reference/android/app/... ইনিশিয়াল মন্তব্য দেখুন: stackoverflow.com/questions/4414171/...
ForceMagic

3
@ ফোরস ম্যাজিক - অবিশ্বাস্য API গুলি ব্যবহারের জন্য গুগল অ্যাপসটিকে প্রত্যাখ্যান করে না ; আরও, গুগল অ্যান্ড্রয়েড অ্যাপ্লিকেশনগুলির জন্য কেবল বিতরণ চ্যানেল নয়। এটি বলেছিল, এই এপিআই থেকে প্রাপ্ত তথ্য নির্ভরযোগ্য নয় তা মনে রাখা উচিত।
ক্রিস স্ট্রাটন

@ ক্রিসট্রেটটন আকর্ষণীয়, তবে আপনি সম্ভবত সঠিক, যদিও এটি মূল যুক্তির জন্য এটি ব্যবহার করতে নিরুৎসাহিত করা হচ্ছে তারা অ্যাপটিকে প্রত্যাখ্যান করবে না। আপনি মন্তব্য লিঙ্কটি থেকে স্কাই কেলসিকে সতর্ক করতে চাইতে পারেন।
ফোর্স ম্যাজিক

3
"getRunningTasks" এপিআই 21 এর জন্য কাজ করে এবং তাই এটি LOLLIPOP এর জন্য কাজ করার আরও একটি উপায় নির্ধারণ করা ভাল ধারণা হতে পারে (আমি নিজেই এই
বিষয়টি জানলাম

0

ললিপপ এবং উপরে:

মেইনফেষ্টে যুক্ত করুন:

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

এবং এর মতো কিছু করুন:

if( mTaskId < 0 )
{
    List<AppTask> tasks = mActivityManager.getAppTasks(); 
    if( tasks.size() > 0 )
        mTaskId = tasks.get( 0 ).getTaskInfo().id;
}

4
এটি মার্শমালোতে
অবহিত

0

আমার অ্যাপটি অগ্রভাগে রয়েছে কিনা তা আমি এইভাবে যাচাই করছি। দ্রষ্টব্য আমি অফিসিয়াল অ্যান্ড্রয়েড ডকুমেন্টেশন দ্বারা প্রস্তাবিত হিসাবে AsyncTask ব্যবহার করছি `

`

    private class CheckIfForeground extends AsyncTask<Void, Void, Void> {
    @Override
    protected Void doInBackground(Void... voids) {

        ActivityManager activityManager = (ActivityManager) mContext.getSystemService(Context.ACTIVITY_SERVICE);
        List<ActivityManager.RunningAppProcessInfo> appProcesses = activityManager.getRunningAppProcesses();
        for (ActivityManager.RunningAppProcessInfo appProcess : appProcesses) {
            if (appProcess.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
                Log.i("Foreground App", appProcess.processName);

                if (mContext.getPackageName().equalsIgnoreCase(appProcess.processName)) {
                    Log.i(Constants.TAG, "foreground true:" + appProcess.processName);
                    foreground = true;
                    // close_app();
                }
            }
        }
        Log.d(Constants.TAG, "foreground value:" + foreground);
        if (foreground) {
            foreground = false;
            close_app();
            Log.i(Constants.TAG, "Close App and start Activity:");

        } else {
            //if not foreground
            close_app();
            foreground = false;
            Log.i(Constants.TAG, "Close App");

        }

        return null;
    }
}

এবং AsyncTask এভাবে চালিত করুন। new CheckIfForeground().execute();


আপনি কি এই জন্য একটি লিঙ্ক আছে?
user1743524

0

আমি একটি পদ্ধতিতে দুটি সমাধান একত্রিত করেছি এবং এটি API 24 এবং API 21 এর জন্য আমার পক্ষে কাজ করে Others অন্যরাও আমি পরীক্ষা করি নি।

কোটলিনে কোড:

private fun isAppInForeground(context: Context): Boolean {
    val appProcessInfo = ActivityManager.RunningAppProcessInfo()
    ActivityManager.getMyMemoryState(appProcessInfo)
    if (appProcessInfo.importance == IMPORTANCE_FOREGROUND ||
            appProcessInfo.importance == IMPORTANCE_VISIBLE) {
        return true
    } else if (appProcessInfo.importance == IMPORTANCE_TOP_SLEEPING ||
            appProcessInfo.importance == IMPORTANCE_BACKGROUND) {
        return false
    }

    val am = context.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
    val foregroundTaskInfo = am.getRunningTasks(1)[0]
    val foregroundTaskPackageName = foregroundTaskInfo.topActivity.packageName
    return foregroundTaskPackageName.toLowerCase() == context.packageName.toLowerCase()
}

এবং ম্যানিফেস্টে

<!-- Check whether app in background or foreground -->
<uses-permission android:name="android.permission.GET_TASKS" />
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.