ক্রিয়াকলাপের স্ট্যাকটি সাফ করার জন্য আপনি কীভাবে ইনটেন্ট? FLAG_ACTIVITY_CLEAR_TOP ব্যবহার করবেন?


85

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

// activity B
@Override
public boolean onKeyDown(int keyCode, KeyEvent event)  {
 if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.ECLAIR
  && keyCode == KeyEvent.KEYCODE_BACK
  && event.getRepeatCount() == 0) onBackPressed();
 return super.onKeyDown(keyCode, event);
}
@Override
public void onBackPressed() {
 startActivity(new Intent(this, UI.class)
 .setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK));
 return;
}

ব্রাউজার থেকে ফিরে আসার পরে, স্ট্যাকটি হ'ল ... এ, বি, ব্রাউজার, বি

আমি আশা করি যে এই কোডটি স্ট্যাকটি ... এ ... এ পরিবর্তিত হবে যাতে আরও একবার চাপলে ব্যবহারকারীকে আবার হোম স্ক্রিনে নিয়ে যায়।

পরিবর্তে মনে হচ্ছে স্ট্যাকটি ... এ, বি, ব্রাউজার, বি, এ ... এ বদলে গেছে যেন though পতাকাগুলি নেই।

আমি স্টার্টঅ্যাক্টিভিটির পরে ক্রিয়াকলাপ বি তে ফিনিশ () কল করার চেষ্টা করেছি, কিন্তু তারপরে পিছনের বোতামটি আবার আমাকে ব্রাউজারে নিয়ে যায়!

আমি কী মিস করছি? ধন্যবাদ!

উত্তর:


72

@ বিস্টেস্টারের সঠিক সমাধান রয়েছে তবে আরও একটি ধাপ রয়েছে:

এটা দূরে ডক্সে লুকানো ছিল, তবে আপনি পরিবর্তন করতে হবে launchModeএর Activityপরিবর্তে অন্য কিছু standard। অন্যথায় এটি শীর্ষে পুনরায় সেট করার পরিবর্তে ধ্বংস হয়ে যাবে এবং পুনরায় তৈরি করা হবে।


52
আসলে ... Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOPঠিক তাই করবে।
ডার্ক-জানুয়ারী

এর উদাহরণের জন্য স্টিল_ফেজেক্সের সমাধান পরীক্ষা করে দেখুন।
দর্পণ

4
তাহলে স্টিল_ফেজেক্সের সমাধান কোথায় ?!
চ্যাং ওয়ান জেং জুসাইকুল

112

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

এটি আসলে আমার কোডে কাজ করে:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK) {
        Intent a = new Intent(this,A.class);
        a.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        startActivity(a);
        return true;
    }
    return super.onKeyDown(keyCode, event);
}       

4
এই সমাধানটি মধ্যস্থতাকারী সমস্ত কার্যক্রম বন্ধ করে দিচ্ছে; তবে, রুটঅ্যাক্টিভিটি পুনরায় চালু করা হচ্ছে। আপনি নীচে @ ইস্পাত_ফেজেক্সের সমাধানটি পরীক্ষা করতে পারেন। এটি একই কাজ করে তবে রুটএকটিভিটি পুনরায় আরম্ভ করে না।
দর্পণ

এটিই আমার মামলার সেরা সমাধান। আমি আসলে চান রুট কার্যকলাপ আবার শুরু করার জন্য
Tash Pemhiwa

24

এর জন্য, আমি FLAG_ACTIVITY_CLEAR_TOPশুরু করার জন্য পতাকা ব্যবহার করি Intent
(ছাড়াই FLAG_ACTIVITY_NEW_TASK)

এবং launchMode = "singleTask"চালু হওয়া ক্রিয়াকলাপের জন্য প্রকাশ্যে।

দেখে মনে হচ্ছে এটি আমার প্রয়োজন মতো কাজ করে - ক্রিয়াকলাপটি আরম্ভ হয় না এবং অন্যান্য সমস্ত ক্রিয়াকলাপ বন্ধ রয়েছে।


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

আপনার শব্দ আরও বিজ্ঞতার সাথে চয়ন করুন। বিটস্টার সমাধান আসলে কাজ করে!
জেস্পার বিশফফ-জেনসেন

সিঙ্গেল টাস্ক আমার পক্ষে কাজ করে, তাই ক্রিয়াকলাপটি পুনরায় তৈরি করা যাবে না এবং অন্নইন্টেন্টে ইভেন্ট হ্যান্ডেল করবে না।
জিশি চেন

11

যদিও এই প্রশ্নের ইতিমধ্যে যথেষ্ট উত্তর রয়েছে, আমি ভেবেছিলাম যে কেউ এই পতাকাটি এই অদ্ভুত উপায়ে কেন কাজ করে তা জানতে চাইবে, অ্যান্ড্রয়েড ডকুমেন্টেশনে এটিই আমি খুঁজে পেয়েছি

উপরের উদাহরণে ক্রিয়াকলাপ বি বর্তমানে চলমান দৃষ্টান্তটি হয় হয় এখানে আপনি নতুন অনিয়েন্ট () পদ্ধতিতে আপনি যে নতুন উদ্দেশ্যটি শুরু করছেন তা পাবেন, বা নিজেই শেষ হয়ে নতুন উদ্দেশ্য নিয়ে পুনরায় চালু হবে।

যদি এটির প্রবর্তন মোডটিকে "একাধিক" (ডিফল্ট) হিসাবে ঘোষণা করেছে এবং আপনি একই উদ্দেশ্যে FLAG_ACTIVITY_SINGLE_TOP সেট না করে রেখেছেন, তবে এটি সমাপ্ত হবে এবং পুনরায় তৈরি হবে; অন্যান্য সমস্ত লঞ্চ মোডের জন্য বা যদি FLAG_ACTIVITY_SINGLE_TOP সেট করা থাকে তবে এই ইন্টেন্টটি বর্তমানের ইনস্ট্যান্ট-এর নিউইন্টেন্টে সরবরাহ করা হবে)


সুতরাং, হয়,
1launchModeক্রিয়াকলাপ এ এর ​​মানকে স্ট্যান্ডার্ড (যেমন। singleTaskবা কিছু) থেকে অন্য কিছুতে পরিবর্তন করুন । তারপরে আপনার পতাকা FLAG_ACTIVITY_CLEAR_TOPআপনার ক্রিয়াকলাপ এ পুনরায় আরম্ভ করবে না A.

বা,

Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOPআপনার পতাকা হিসাবে ব্যবহার করুন । তাহলে এটি আপনার ইচ্ছা মতো কাজ করবে work


8

সমস্যাটি সমাধান করতে আমি তিনটি পতাকা ব্যবহার করি:

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|
                Intent.FLAG_ACTIVITY_CLEAR_TASK | 
                Intent.FLAG_ACTIVITY_NEW_TASK);

4

অ্যান্ড্রয়েড যুক্ত করুন: ম্যানিফেস্ট ফাইলটিতে noHistory = "সত্য"।

<manifest >
        <activity
            android:name="UI"
            android:noHistory="true"/>

</manifest>

প্রথমবার এই পতাকাটি দেখুন, তবে এটি আমার ক্ষেত্রে কাজ করেছে, ধন্যবাদ
11:54 এ vlasentiy

3

আমি activity_name.this.finish()নতুন অভিপ্রায় শুরু করার পরে ফোন করেছি এবং এটি আমার পক্ষে কাজ করেছে।

I tried "FLAG_ACTIVITY_CLEAR_TOP" and "FLAG_ACTIVITY_NEW_TASK"

তবে এটি আমার পক্ষে কার্যকর হবে না ... আমি এই সমাধানটি ব্যবহারের জন্য প্রস্তাব দিচ্ছি না তবে যদি পতাকাটি সেট করা আপনার পক্ষে এটি চেষ্টা করার চেয়ে কার্যকর না হয় তবে তবুও আমি এটি ব্যবহার না করার পরামর্শ দিই recommend


2

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

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

"যদি বর্তমান কাজটির শীর্ষে ক্রিয়াকলাপের কোনও উদাহরণ ইতিমধ্যে উপস্থিত থাকে তবে সিস্টেম সেই উদ্দেশ্যটিকে উদ্দেশ্য করে ..."

যেহেতু বি এ শুরু করে, বর্তমান টাস্কটি বি এর কাজ, যা এককক্ষেত্রের জন্য এবং সুতরাং এটিকে পছন্দসই ফলাফল অর্জনের জন্য সিঙ্গেল টাস্ক ব্যবহার করতে পারে না কারণ তখন সিস্টেমটি এ-এর কার্যটি সন্ধান করবে এবং সেই কার্যটি অগ্রভাগে আনবে।

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


1

FLAG_ACTIVITY_NEW_TASK এখানে সমস্যা হ'ল এটি একটি নতুন কাজ শুরু করে Jএটি কেবল অপসারণ করুন এবং আপনার কাজ শেষ।

ভাল আমি আপনাকে প্রতিটি ফ্ল্যাগ তাদের সাথে কাজ করার আগে যা করে তা পড়ার পরামর্শ দিচ্ছি

এই & ইন্টেন্ট ফ্ল্যাগগুলি এখানে পড়ুন


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

আপনি নিশ্চিত তুমি কেন singleInstance যেমন বি ব্যবহার করছে না aa "singleInstance" কার্যকলাপ কাজ যেন FLAG_ACTIVITY_NEW_TASK intent.Check ছিল developer.android.com/guide/topics/fundamentals.html
100rabh

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

আমি মনে করি এটি কার্যকর হয়নি কারণ আপনি সেখানে FLAG_ACTIVITY_NEW_TASK ব্যবহার করেছেন B তবে কেবলমাত্র FLAG_ACTIVITY_CLEAR_TOP ব্যবহার করুন এবং একক টাস্ক বা সিঙ্গলইনস্ট্যান্স না ব্যবহার এড়িয়ে চলুন
100rabh

4
আমি মনে করি এটি কার্যকর সমাধান হওয়া উচিত, যদি আপনি Intent.FLAG_ACTIVITY_SINGLE_TOP
পুনরুক্তি

1

প্রাথমিকভাবে আমার কাজ করতে FLAG_ACTIVITY_CLEAR_TOP পেতে সমস্যা হয়েছিল। অবশেষে আমি এর মান (0x04000000) ব্যবহার করে এটি কাজ করতে পেলাম। সুতরাং দেখে মনে হচ্ছে একটি গ্রহন / সংকলক সমস্যা আছে। তবে দুর্ভাগ্যক্রমে বেঁচে থাকা ক্রিয়াকলাপটি আবার শুরু হয়েছে, যা আমি চাই না। সুতরাং দেখে মনে হচ্ছে কোনও সহজ সমাধান নেই।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.