ক্লিয়ারিং অভিপ্রায়


111

আমার অ্যান্ড্রয়েড অ্যাপ্লিকেশনটি এমন একটি অভিপ্রায় দ্বারা কল করছে যা তথ্য পাস করছে (স্ট্যাটাসবারে স্থগিত)।

আমি যখন হোম বোতামটি হিট করি এবং হোম বোতামটি ধরে রেখে আমার অ্যাপ্লিকেশনটি পুনরায় খুলি তখন এটি পুনরায় উদ্দেশ্যটিকে কল করে এবং একই অতিরিক্তগুলি এখনও সেখানে রয়েছে।

    @Override
    public void onSaveInstanceState(Bundle savedInstanceState) {
      super.onSaveInstanceState(savedInstanceState);
    }
    @Override
    public void onRestoreInstanceState(Bundle savedInstanceState) {
      super.onRestoreInstanceState(savedInstanceState);
    }

এটি এমন কোড যা এর অনুমানের মতো চলে না

    String imgUrl;
    Bundle extras = this.getIntent().getExtras();


    if(extras != null){
        imgUrl = extras.getString("imgUrl");
        if( !imgUrl.equals(textView01.getText().toString()) ){

            imageView.setImageDrawable( getImageFromUrl( imgUrl ) );
            layout1.setVisibility(0);
            textView01.setText(imgUrl);//textview to hold the url

        }

    }

এবং আমার অভিপ্রায়:

public void showNotification(String ticker, String title, String message, 
    String imgUrl){
    String ns = Context.NOTIFICATION_SERVICE;
    NotificationManager mNotificationManager = 
        (NotificationManager) getSystemService(ns);
    int icon = R.drawable.icon;        // icon from resources
    long when = System.currentTimeMillis();         // notification time
    CharSequence tickerText = ticker;              // ticker-text

    //make intent
    Intent notificationIntent = new Intent(this, activity.class);
    notificationIntent.putExtra("imgUrl", imgUrl);
    notificationIntent.setFlags(
        PendingIntent.FLAG_UPDATE_CURRENT | 
        PendingIntent.FLAG_ONE_SHOT);
    PendingIntent contentIntent = 
        PendingIntent.getActivity(this, 0, 
        notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT | 
        PendingIntent.FLAG_ONE_SHOT);

    //make notification
    Notification notification = new Notification(icon, tickerText, when);
    notification.setLatestEventInfo(this, title, message, contentIntent);
    //flags
    notification.flags = Notification.FLAG_SHOW_LIGHTS | 
        Notification.FLAG_ONGOING_EVENT | 
        Notification.FLAG_ONLY_ALERT_ONCE | 
        Notification.FLAG_AUTO_CANCEL;
    //sounds
    notification.defaults |= Notification.DEFAULT_SOUND;
    //notify
    mNotificationManager.notify(1, notification);
}

অভিপ্রায়টি পরিষ্কার করার বা এটি আগে ব্যবহার করা হয়েছে কিনা তা পরীক্ষা করার কোনও উপায় আছে কি?


আপনি কি আপনার কোড পোস্ট করতে পারেন?
xandy

আমি আমার প্রশ্নের কোডটি যুক্ত করেছি
মঙ্গলবার

ইন্টেন্ট সাফ করার পরিবর্তে, আপনি লঞ্চের ধরণ নির্ধারণ করতে পারেন এবং সেই অনুযায়ী অ্যাপ্লিকেশন প্রবাহকে পরিচালনা করতে পারেন। কেবলমাত্র বিজ্ঞপ্তির জন্য এবং ব্যাকগ্রাউন্ড থেকে নয় তবে অতিরিক্তগুলি পান। stackoverflow.com/questions/4116110/cleering-intent/…
বিবি

উত্তর:


168

হালনাগাদ:

আমি বুঝতে পারি নি যে এই উত্তরটি এত বেশি উল্লেখ করা হবে যখন আমি প্রথম 5 বছর আগে এটি আরও লিখেছিলাম!

আমি স্পষ্ট করে বলতে চাই যে @ টাটো-রডরিগো উত্তর অনুসারে এটি আপনাকে কিছু পরিস্থিতিতে ইতিমধ্যে পরিচালিত অভিপ্রায় সনাক্ত করতে সহায়তা করবে না।

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


আমার ঠিক একই সমস্যা ছিল।

উত্তরের উত্তর আমাকে সঠিক ট্র্যাকের উপরে ফেলেছে এবং আমি আরও সহজ সমাধান পেয়েছি, এটি ব্যবহার করুন:

getIntent().removeExtra("key"); 

উদ্দেশ্যটি "ক্লিয়ার" করতে কল করুন।

একবছর আগে এটি জিজ্ঞাসা করা হওয়ার পরে এটি কিছুটা দেরি করে উত্তর দিলেও আশা করি এটি ভবিষ্যতে অন্যদের সহায়তা করবে helps


4
অপসারণের () পদ্ধতিটি স্ট্রিং প্যারামিটার নেয় না? এই getIntent ()। অপসারণের ("স্ট্রিং") পছন্দ করুন;
tony9099

25
@ মেকস আমি ভুল হতে পারি তবে আমি মনে করি এটি নিম্নলিখিত দৃশ্যে কাজ করবে না: 1) বিজ্ঞপ্তির মাধ্যমে ক্রিয়াকলাপটি খুলুন; 2) পিছনের বোতামটি চাপিয়ে ক্রিয়াকলাপ শেষ করুন; 3) ইতিহাস (সাম্প্রতিক অ্যাপস) এর মাধ্যমে ক্রিয়াকলাপটি আবার খুলুন। অন্য কেসটি হ'ল যখন সিস্টেম অভাবের কারণে অ্যাপ্লিকেশনটিকে হত্যা করে (বিকাশকারী বিকল্পগুলির আওতায় "ক্রিয়াকলাপগুলি রাখবেন না" সক্ষম করুন এবং তারপরে কেবল হোম চাপুন তারপরে ইতিহাস থেকে ক্রিয়াকলাপটি আবার খুলুন)। আমি নীচে ব্যবহার করছি সমাধান পোস্ট। আপনি যদি এই মন্তব্য করতে পারেন তাহলে দুর্দান্ত হবে।
tato.rodrigo

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

2
ইন্টেন্ট সাফ করার পরিবর্তে, আপনি লঞ্চের ধরণ নির্ধারণ করতে পারেন এবং সেই অনুযায়ী অ্যাপ্লিকেশন প্রবাহকে পরিচালনা করতে পারেন। কেবলমাত্র বিজ্ঞপ্তির জন্য এবং ব্যাকগ্রাউন্ড থেকে নয় তবে অতিরিক্তগুলি পান। stackoverflow.com/questions/4116110/cleering-intent/…
বিবি

2
আমার পক্ষে কাজ করেনি। আমি @ tato.rodrigo হিসাবে একই সমস্যার মুখোমুখি হয়েছি যেখানে উল্লেখ করা হয়েছে যে নোটিফিকেশনের মাধ্যমে বা ইতিহাস বা তার উল্লেখ করা অন্যান্য কারণ থেকে ক্রিয়াকলাপটি খোলা থাকলে উদ্দেশ্যটি পরিষ্কার হচ্ছে না, তাই অভিপ্রায় তথ্য গ্রহণ করার পরে আমি যা করেছি তা হ'ল উদ্দেশ্যটি পুনরায় সেট করা to এটি setIntent(new Intent())এবং এখন এটির কাজ ঠিক আছে।
শুভ্রাল

43

সম্পাদনা: আমি যে সম্পূর্ণ সমাধানটি আমি ব্যবহার করছি তা পোস্ট করতে সম্পাদনা করছি।

সমস্যাটি "ইতিহাস (সাম্প্রতিক অ্যাপস) থেকে ক্রিয়াকলাপ শুরু হওয়ার সাথে সাথে কিছু কোড কার্যকর করা হবে না" হলে এই সমাধানটি কাজ করবে ।

সবার আগে, ইতিমধ্যে গ্রাস করা হয়েছে কিনা তা বোঝাতে booleanআপনার মধ্যে একটি ঘোষণা করুন :ActivityIntent

    private boolean consumedIntent;

তারপরে কনফিগারেশন পরিবর্তনগুলি এবং ব্যাকগ্রাউন্ডে যাওয়ার পরে সিস্টেমটি আপনাকে মেরে ফেলতে পারে এমন কেসগুলি হ্যান্ডেল করার জন্য onSaveInstanceStateএবং onCreateপদ্ধতিগুলি ব্যবহার করে নিরাপদে এই মানটি সংরক্ষণ করুন এবং পুনরুদ্ধার করুন Activity

    private final String SAVED_INSTANCE_STATE_CONSUMED_INTENT = "SAVED_INSTANCE_STATE_CONSUMED_INTENT";

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putBoolean(SAVED_INSTANCE_STATE_CONSUMED_INTENT, consumedIntent);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //set content view ...

        if( savedInstanceState != null ) {
            consumedIntent = savedInstanceState.getBoolean(SAVED_INSTANCE_STATE_CONSUMED_INTENT);
        }

        //other initializations
    }

এখন, আপনি onResumeপদ্ধতির অধীনে আপনার কোড চালাতে পারবেন কিনা তা পরীক্ষা করে দেখুন ।

    @Override
    protected void onResume() {
        super.onResume();

        //check if this intent should run your code
        //for example, check the Intent action
        boolean shouldThisIntentTriggerMyCode = [...];
        Intent intent = getIntent();
        boolean launchedFromHistory = intent != null ? (intent.getFlags() & Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY) != 0 : false;
        if( !launchedFromHistory && shouldThisIntentTriggerMyCode && !consumedIntent ) {
            consumedIntent = true;
            //execute the code that should be executed if the activity was not launched from history
        }
    }

অতিরিক্ত হিসাবে, যদি Activityআপনারটিতে কনফিগার করা থাকে তবে singleTopকোনও নতুন Intentবিতরণ করার পরে আপনার পতাকাটি পুনরায় সেট করা উচিত ।

    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        setIntent(intent);
        consumedIntent = false;
    }

12
অনেক ধন্যবাদ! আমার এই কোডটিকে সাহায্য করেছে (intent.getFlags() & Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY)তাই এখন ক্রিয়াকলাপের সূচনা যখন ইতিহাস থেকে হয় তা আমি বুঝতে পারি এবং আমি আমার অতিরিক্তগুলি উপেক্ষা করতে পারি।
রোমান নাজারেভিচ

1
@ লেমবার্গে আমারও একই সমস্যা রয়েছে এবং আমি ঠিক আপনার মতোই সমাধান করেছি, আপনি যদি কিছু অতিরিক্ত ব্যবহার করেন যা পুশ বিজ্ঞপ্তিগুলি থেকে আসে তবে ইতিহাস থেকে আপনার ক্রিয়াকলাপটি শুরু করার ঝুঁকি রয়েছে এবং আপনার অতিরিক্তগুলি গ্রাস করে এবং আপনার মতো একই ক্রিয়ায় পুনঃনির্দেশ করতে পারে ধাক্কা বিজ্ঞপ্তি. পতাকাটি চালু করে ফ্রি
হিস্টোরি

এমনকি যদি ক্রিয়াকলাপটি ধ্বংস হয়ে যায় এবং আমরা ইতিহাস স্ট্যাক থেকে এটি আবারও খুলি তা কি কাজ করে চলেছে?
ব্যবহারকারী 25

মহান! অ্যাপটি ধ্বংস হয়ে গেলেও এটি কাজ করছে বলে মনে হচ্ছে ... তবে দয়া করে @ tato.rodrigo boolean shouldThisIntentTriggerMyCode = [...];উত্তর থেকে সরান (কী জন্য ব্যবহৃত হয়?)
ব্যবহারকারী 25

নির্দিষ্ট ক্ষেত্রে ব্যবহারকারীর জন্য মাল্টি-নোটিফিকেশন সহ আমার ক্ষেত্রে এটি নোটিফিকেশন ইউআইডি যুক্ত consumedIntentহিসাবে ভাল String। এই টাইমটি বর্তমান টাইমস্ট্যাম্প হিসাবে ব্যাকএন্ডে বিজ্ঞপ্তিতে সহজভাবে যুক্ত করা যেতে পারে। এছাড়াও আপনার এই ইউআইডিটি onSaveInstanceStateকেবলমাত্র ইনটেন্টের আকারে আসার পরে সংরক্ষণ করা উচিত onCreate। এর অর্থ আপনার ইউআইড থেকে সংরক্ষণ করা উচিত নয় onNewIntent
কনস্ট্যান্টিন কনোপকো

22

মাকস উত্তর একটি অতিরিক্ত সাফ করার জন্য কাজ করে:

    getIntent().removeExtra("key"); 

আর একটি দরকারী আদেশ হ'ল:

    getIntent().setAction("");

আপনি কল করে একটি উদ্দেশ্যও ট্যাগ করতে পারেন:

    getIntent().putExtra("used", true);

এবং তারপরে মানটি পরীক্ষা করুন।


21

যখন আমরা ইতিহাস (সাম্প্রতিক অ্যাপস) থেকে অ্যান্ড্রয়েড অ্যাপ্লিকেশনগুলি চালু করি, তখন অ্যাপটি প্রাথমিকভাবে তিনটি পৃথক ইন্টেন্ট পতাকা সহ চালু করা যেতে পারে।

  1. FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY
    এটি তখনই করা হয় যখন কোনও অ্যাপ্লিকেশন হ্রাস না করা (দীর্ঘ প্রেস হোম কী) এর ইতিহাস থেকে কার্যকলাপ চালু করা হয়। অবিচ্ছিন্ন
    মান: 1048576 (0x00100000)
  2. FLAG_ACTIVITY_NEW_TASK
    এটি তখনই হয় যখন "অ্যাপ্লিকেশন আইকন ক্লিক করে" বা " ইনটেন্ট ফিল্টারগুলি " এর মাধ্যমে ক্রিয়াকলাপ চালু করা হয় । এখানে ক্রিয়াকলাপটি এই ইতিহাসের স্ট্যাকের উপর একটি নতুন কার্যের সূচনা হয়ে যাবে। অবিচ্ছিন্ন
    মান: 268435456 (0x10000000)
  3. FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY | FLAG_ACTIVITY_NEW_TASK
    এটি তখনই যখন ব্যাকটি বোতাম টিপে অ্যাপটি ছেড়ে দেওয়া হয় এবং তারপরে ইতিহাস (সাম্প্রতিক অ্যাপস) থেকে আবার শুরু করা হয় umed অবিচ্ছিন্ন
    মান: 269484032 (0x10100000)

অবিচ্ছিন্ন মান এর মাধ্যমে পুনরুদ্ধার করা যায় getIntent().getFlags()

তৃতীয় ক্ষেত্রে, অ্যান্ড্রয়েড তার স্মৃতি থেকে সর্বশেষ ইনটেন্ট মানগুলি পুনরায় লোড করে। সুতরাং আপনার অ্যাপ্লিকেশনটির অভিপ্রায় ( getIntent) অ্যাপ্লিকেশনটি চালু করা শেষ অভিপ্রায় থেকে মান থাকবে।

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

 <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER"/>
 </intent-filter>

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

উদ্দেশ্য সমাধান করা এটি সমাধানের এক উপায়, তবে এটি পুরোপুরি সমস্যার সমাধান করবে না! অ্যান্ড্রয়েড ওএস অ্যাপ্লিকেশনগুলি থেকে শেষ প্রবর্তন করার উদ্দেশ্যে ইন্টেন্টটি পুনরায় লোড করে এবং লঞ্চের উদ্দেশ্যটির শেষ উদাহরণ নয়।

এটি হওয়া থেকে বাঁচার একটি পরিষ্কার উপায় হ'ল লঞ্চের ধরণ নির্ধারণের জন্য ইন্টেন্টের ধরণের মাধ্যমে এটি পরিচালনা করা ।

সুতরাং আপনার LaunchActivity মধ্যে (এক যা অভিপ্রায় ফিল্টার স্পষ্ট সংজ্ঞায়িত আছে), আপনি নিম্নলিখিত কোডে ব্যবহার করতে পারে onCreate(), onStart()অথবা onResume()পদ্ধতি।

if(getIntent().getFlags() == (Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY)) {
    //app is launched from recent apps after it was closed
        normalLaunch();
    } else {
        String intentAction = getIntent().getAction();
        String scheme = getIntent().getScheme();
        //app is launched via other means
        // URL intent scheme, Intent action etc
        if("https".equalsIgnoreCase(scheme)) {
            // URL intent for browser
        } else if("com.example.bb".equalsIgnoreCase(intentAction)) {
            // App launched via package name
        } else {
            // App was launched via Click on App Icon, or other means
            normalLaunch();
        }
    }

আমার ধারণা normalLaunch(), উদ্দেশ্য থেকে পরামিতি ব্যবহার করা উচিত নয়; অন্যথায় আপনাকে ইন্টেন্ট প্যারামিটারগুলি ব্যবহার না করার জন্য আপনার ডিফল্ট লঞ্চ পদ্ধতিটি আলাদা এবং অনুকূল করতে হবে।


1
সব নায়ক ক্যাপ পরে না!
এসডেঘেসেমি

আমি জানি না getIntent().getFlags() & Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORYতবে আমি অন্য ক্রিয়াকলাপ (স্টার্টঅ্যাক্টিভিটি পদ্ধতি) থেকে ইতিহাস শুরু করি বা ইতিহাস স্ট্যাক (সাম্প্রতিক অ্যাপস) থেকে এটি আবার খুলি কিনা তা সর্বদা সত্য প্রত্যাবর্তন করে।
ব্যবহারকারী 25

আপনাকে এটিকে অন্য পতাকাগুলির সাথে মিশ্রণে ব্যবহার করতে হবে, সম্ভবত FLAG_ACTIVITY_NEW_TASK
বিবি

1
ডেভ সেটিংস "ক্রিয়াকলাপগুলি রাখবেন না" এর কারণে ব্যাকগ্রাউন্ডে কার্যকলাপ নিহত হওয়ার পরে এটি কাজ করে না। এক্ষেত্রে getIntent () getFlags ()টি প্রথমবারের মতো ক্রিয়াকলাপ শুরু হওয়ার মতোই is
মালাচিয়াজ

ব্যাখ্যাটির প্রশংসা করুন তবে এটি যেমনটি ইচ্ছা তেমন করেনি
আজলান জামাল

18

একটি উদ্দেশ্য উদ্দেশ্য সাফ :

intent.replaceExtras(new Bundle());
intent.setAction("");
intent.setData(null);
intent.setFlags(0);

2
এটি গ্রহণযোগ্য উত্তর হওয়া উচিত। সত্যিই ভাল কাজ করে!
মার্টিন এরলিক

2
"ক্রিয়াকলাপগুলি রাখবেন না" যখন বিকাশকারী বিকল্পগুলিতে চেক করা হয় তখন কাজ করে না
জেমশিট ইস্কেন্দরভ

8

সংক্ষিপ্ত উত্তর কোন উপায় নেই

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

setAction("")

তবে এটি কাজ করে না কারণ উদ্দেশ্যটি ইতিমধ্যে লগইন করা অবধি আপনি এটি নিউইন্টেন্ট () বা অন স্টার্ট () পদ্ধতির অভ্যন্তরে প্রবেশ করবেন না।

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

অ্যালগরিদম:

  1. ক্রিয়াকলাপে "প্রস্থান" ক্রিয়াকলাপটি পাস করে এমন বিজ্ঞপ্তি নিয়ন্ত্রণের জন্য পেন্ডিং ইন্টেন্ট তৈরি করুন। তবে বিশেষ ক্রিয়াকলাপে যা একটি সাধারণ প্রক্সি।
  2. স্টক () কোডের প্রক্সি ক্রিয়াকলাপ উদ্দেশ্যটিকে বিশ্লেষণ করে, ক্রিয়াটি পরীক্ষা করে এবং কিছু মডেলের স্থিতিকে "প্রস্থানিত" হিসাবে সেট করে।
  3. প্রকট ক্রিয়াকলাপ অনস্টার্ট () কোড সেটআইটেন্ট ("") ব্যবহার করে আসল উদ্দেশ্যটি সাফ করে এবং তারপরে স্টার্টএটিভিটি (অভিপ্রায়) কল করে গন্তব্য "রুট" ক্রিয়াকলাপে প্রেরণ করে।
  4. স্টক () কোড প্রকৃতির ক্রিয়াকলাপ শেষ হওয়া () কোডটি আহবান করে।
  5. গন্তব্য ক্রিয়াকলাপের চেক মডেল স্টেটের অনস্টার্ট () এবং onNewIntent () এর ভিতরে এবং কলটি ফিনিস () যদি এটি "প্রস্থানিত" হয় (এবং আমার ক্ষেত্রে স্টপ সার্ভিস () কেও কল করুন) call

আমি আশা করি এটি কারও পক্ষে সহায়তা করবে কারণ আমি ইন্টারনেটে উত্তরটি খুঁজে পাইনি।


আমি এটি সবচেয়ে সঠিক উত্তর খুঁজে পাই, যেহেতু "উদ্দেশ্যটি সাফ করা" এর অর্থ "নির্দিষ্ট অতিরিক্ত অপসারণ" করার প্রয়োজন হয় না। আমি এটিও করি না যে এটি করার সহজ উপায় আছে।
mdelolmo

5

নিশ্চিত করুন যে আপনি ব্যবহার করছেন PendingIntent.FLAG_UPDATE_CURRENT জন্য তা পতাকাঙ্কিত PendingIntent

PendingIntent pendingIntent = PendingIntent.getActivity(this, 100, mPutIntent, PendingIntent.FLAG_UPDATE_CURRENT);

কোথায় mPutIntentতোমার Intent

আশা করি এটা তোমাকে সাহায্য করবে।


1
আমার জীবন সংরক্ষিত!!
eren130

1
এটি কীভাবে গৃহীত উত্তর নয় তা আমি পাই না। আমার একমাত্র অনুশোচনা কেবল একটি: একক উত্সাহ দেওয়া। চিয়ার্স।
অ্যান্ডি

2

আমার সম্প্রতি এই সমস্যা হয়েছিল এবং উদ্দেশ্যটির অতিরিক্ত পরামিতি হিসাবে টাইমস্ট্যাম্প যুক্ত করে আমি এটি সমাধান করেছি:

private void launchActivity(Context context) {
    Intent intent = new Intent(context, MainActivity.class);
    intent.putExtra("KEY_EXTRA_TIMESTAMP", System.currentTimeMillis());
    context.startActivity(intent);
}

এর পরে, ভাগ করা পছন্দগুলিতে টাইমস্ট্যাম্পটি সংরক্ষণ করুন:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    long time = getIntent().getLongExtra("KEY_EXTRA_TIMESTAMP", -1);
    long previousTime = getPreferences(MODE_PRIVATE).getLong("timestamp", -1);

    //ignore if the timestamp is the same as the previous one  
    if (time != previousTime) {
        handleIntent(getIntent());
        if (time != -1) {
            //save the timestamp
            getPreferences(MODE_PRIVATE).edit().putLong("timestamp", time).apply();
        }
    }
}

1

আমি ঠিক একই সমস্যা পেয়েছি। আমার সমাধানটি booleanপরিবর্তনশীল যুক্ত করা Intentছিল যা 'ব্যবহার' হওয়ার সময় সেট করা হয়েছিল এবং এর ifভিত্তিতে বিবৃতি booleanআপনার ব্যবহার করা উচিত কিনা তা পরীক্ষা Intentকরতে।


3
এটি সম্ভবত কাজ করবে না, কারণ ক্রিয়াকলাপ বন্ধ হয়ে গেলে এবং পুনরায় শুরু করা হলে বুলিয়ান মানগুলি পুনরায় তৈরি করা হবে (যদি অ্যাক্টিভিটিতে বিশ্বব্যাপী ঘোষিত হয়)। (উদাহরণস্বরূপ হোম বোতামে ক্লিক করা)
টনি 9099

1

আপনি যখন অভিপ্রায়টি প্রক্রিয়াকরণ শেষ করেন, তখন এটি করুন:

setIntent(null);

আপনি সেই প্রসেসড ইন্টেন্টটি আর দেখতে পাবেন না এবং প্রক্রিয়াজাত ইনটেন্টের সামগ্রীগুলি সম্পাদনা করে আপনি সমস্যার মুখোশ পাবেন না।


1

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

সমস্যার সমাধান হিসাবে , ইন্টেন্ট এক্সট্রা প্রক্রিয়া করার পরে আমি বুলিয়ান মানটি শেয়ারডপ্রিফারেন্সে সঞ্চিত করি । যখন একই উদ্দেশ্য ক্রিয়াকলাপে পুনরায় বিতরণ করা হয়, তখন আমি SharedPreferences মানটি পরীক্ষা করি এবং উদ্দিষ্ট অতিরিক্তটি প্রক্রিয়া করার সিদ্ধান্ত নিই। আপনি যদি একই ক্রিয়াকলাপে আরও একটি নতুন ইন্টেন্ট অতিরিক্ত প্রেরণ করেন তবে আপনি SharedPreferences মানটি মিথ্যা করেন এবং ক্রিয়াকলাপ এটি প্রক্রিয়া করবে। উদাহরণ :

// Start Activity with Intent Extras
Intent intent = new Intent(context, MyActivity.class);
intent.putExtra("someData", "my Data");
// Set data as not processed
context.getSharedPreferences(BuildConfig.APPLICATION_ID, Context.MODE_PRIVATE).edit().putBoolean("myActivityExtraProccessed", false).commit();
context.startActivity(intent);

...

public class MyActivity{

    ...
    public void someMethod(){
        boolean isExtrasProcessed = context.getSharedPreferences(BuildConfig.APPLICATION_ID, Context.MODE_PRIVATE).getBoolean("myActivityExtraProccessed", false);  
         if (!isExtrasProcessed) {
              // Use Extras

              //Set data as processed
              context.getSharedPreferences(BuildConfig.APPLICATION_ID, Context.MODE_PRIVATE).edit().putBoolean("myActivityExtraProccessed", true).commit();
         }
    }

}


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

0

ইন্টেন্ট এবং ইনটেন্ট অতিরিক্তগুলি পার্স করার পরে ম্যানুয়ালি মুছে ফেলার পরেও দেখে মনে হয় ক্রিয়াকলাপ.জেট ইন্টেন্ট () সর্বদা ক্রিয়াকলাপ শুরু হওয়া মূল ইচ্ছাকে ফিরিয়ে দেবে।

এটি কাছাকাছি পেতে, আমি এই জাতীয় কিছু সুপারিশ:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // The Intent provided by getIntent() (and its extras) will persist through a restore
    // via savedInstance.  Because of this, restoring this activity from a
    // an instance that was originally started with extras (deep-link or 
    // pre-defined destination) may cause un-desired behavior
    // (ie...infinite loop of sending the user directly to somewhere else because of a
    // pre-defined alternate destination in the Intent's extras).
    //
    // To get around this, if restoring from savedInstanceState, we explicitly
    // set a new Intent *** to override the original Intent that started the activity.***
    // Note...it is still possible to re-use the original Intent values...simply
    // set them in the savedInstanceState Bundle in onSavedInstanceState.
    if (savedInstanceState != null) {
        // Place savedInstanceState Bundle as the Intent "extras"
        setIntent(new Intent().putExtras(savedInstanceState));
    }

    processIntent(getIntent())
}

private void processIntent(Intent intent) {
    if (getIntent().getExtras() == null) {
        // Protection condition
        return;
    }

    doSomething(intent.getExtras.getString("SOMETHING_I_REALLY_NEED_TO_PERSIST"));

    final String somethingIDontWantToPersist = 
        intent.getExtras.getString("SOMETHING_I_DONT_WANT_TO_PERSIST");

    if(somethingIDontWantToPersist != null) {
        doSomething(somethingIDontWantToPersist);
    }
}

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    // Save selective extras from original Intent...
    savedInstanceState.putString("SOMETHING_I_REALLY_NEED_TO_PERSIST", "persistedValued");
    super.onSaveInstanceState(savedInstanceState);
}

এইভাবে, মূল ইন্টেন্ট / ইনটেন্ট অতিরিক্তগুলির নির্দিষ্ট কিছু অংশ স্পষ্টভাবে ধরে রাখার ক্ষমতা বজায় রেখে মূল ইন্টেন্টটি ডাম্প করার একটি ব্যবস্থা রয়েছে।

মনে রাখবেন যে আমি সমস্ত ক্রিয়াকলাপের প্রবর্তন পদ্ধতিগুলি পরীক্ষা করি নি।


0

সোজা এগিয়ে যাওয়ার উপায় হ'ল onCreate () ব্যতীত অন্য পদ্ধতি থেকে getIntent () কল করা এড়ানো। তবে ব্যবহারকারী যদি হোম বোতামটি আলতো চাপ দিয়ে আমাদের ক্রিয়াকলাপটি ছেড়ে দেয় তবে পরবর্তী প্রবর্তনের সময় এটি সমস্যার সৃষ্টি করবে। আমি মনে করি এই সমস্যার সম্পূর্ণ কার্যকরী সমাধান নেই।


0

আমি একই সমস্যার মুখোমুখি হয়েছি এবং উপরের পদ্ধতিগুলি ব্যবহার করার চেষ্টা করি তবে এটি কার্যকর হয় না।

আমি মনে করি এটি অ্যাক্টিভিটির লঞ্চ মোডের কারণ হতে পারে যা আমি সিঙ্গলটপ মোড ব্যবহার করেছি।

আমি যখন অ্যাপ্লিকেশন ব্যাকগ্রাউন্ড করি এবং র‍্যামএটার ব্যবহার করি তখন ইস্যুটি সবসময় অতিরিক্ত থাকে এমনকি ইস্যুটি শুল্ক করতে বা কী মুছে ফেলতে পারে remove

অ্যান্ড্রয়েডে অগ্রাধিকার স্টোরেজ ব্যবহার করে সমস্যাটি কেটে গেছে যা পরীক্ষা করে গেছে to


0

অতিরিক্ত অতিরিক্ত খাওয়া হয়েছে কিনা তা জেনে অন্য অতিরিক্ত যুক্ত করা ভাল অভ্যাস নয়, কেন এটি করছেন না ?:

if (intent.hasExtra(EXTRA_NAME) && intent.getBooleanExtra(EXTRA_NAME, false)) {
    // consume extra here after that set it to false
    putExtra(EXTRA_NAME, false)
}   

-1

এ কেমন? উদ্দেশ্য হিসাবে নতুন ইনটেন্ট সেট করে।

@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    setIntent(intent);
}

1
আমি মনে করি না যে এটি কাজ করে। ক্রিয়াকলাপটি ইতিহাস থেকে পুনরায় তৈরি করা হয়, অভিপ্রায়টি প্রভাবিত হয় না।
mdelolmo

-1

আপনি যখন উদ্দেশ্যটি সাফ করতে চান - তবে কীভাবে এটি একটি খালি দিয়ে প্রতিস্থাপন করবেন?

যেমন।

@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    setIntent(intent);
}

@Override 
public void onResume() {
    super.onResume();

    Intent theIntent = getIntent();
    if ("myaction".equals(theIntent.getAction()) {
         handleIntent();
         onNewIntent(new Intent());  // <--- "clear" the intent by setting empty one
    }
}

-1

এটি আশাবাদী প্রত্যেককে সহায়তা করবে। সুতরাং প্রথম আমরা অভিপ্রায় পেতে

//globally
Intent myIntent;

এটি কোথাও অনক্রিট রাখুন

myIntent = getIntent();
String data = myIntent.getStringExtra("yourdata");
//Your process here

এখনই এটি সেট করুন যাতে প্রতিবারই আমাদের অ্যাপ্লিকেশনটি ধ্বংস হয়ে যায় বা বের হয় আমরা ডেটা সরিয়ে ফেলব

@Override
protected void onDestroy() {
    //TODO: Clear intents
    super.onDestroy();
    myIntent.removeExtra("data");
}
@Override
protected void onBackPressed() {
    //TODO: Clear intents
    super.onBackPressed();
    myIntent.removeExtra("data");
}

আপনি ধারণা পাবেন, এটি যথেষ্ট না হলে কেবল 'অন' কলব্যাকগুলি সন্ধান করুন


আপনি যখন অ্যাপ্লিকেশনটি প্রস্থান করবেন কেবল তখনই উদ্দেশ্যটি সাফ হবে। রিসেন্টগুলি সোয়াইপ করা।
পিক্সেল্ড্রয়েড মোডিং

-2

যখন Intent.removeExtra("key")অতিরিক্তগুলি থেকে একটি নির্দিষ্ট কী সরিয়ে ফেলা হবে, তেমন একটি পদ্ধতিও রয়েছে ইনটেন্ট.রেপ্লেসেক্সট্রাস (বান্ডিল) , যা nullপরামিতি হিসাবে পাস করার পরে ইনটেন্ট থেকে পুরো অতিরিক্তগুলি মুছতে ব্যবহার করা যেতে পারে ।

ডক্স থেকে:

অতিরিক্ত প্রদত্ত বান্ডিলের সাথে ইনটেন্টে অতিরিক্তগুলি সম্পূর্ণরূপে প্রতিস্থাপন করুন।

প্যারামিটারগুলি
অতিরিক্ত অতিরিক্ত ইনটেন্টে অতিরিক্ত সেটগুলির সেট বা সমস্ত অতিরিক্ত মোছার জন্য নালার।

কারণ পুটএক্সএক্সএক্স () পদ্ধতিগুলি একটি টাটকা বান্ডিল দিয়ে অতিরিক্তগুলি শুরু করে যদি এটি নাল হয়, এটি কোনও সমস্যা নয়।


-3
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
intent.addCategory(Intent.CATEGORY_HOME);  
startActivity(intent);

2
আপনি কী করছেন এবং ওপি-র প্রশ্নের উত্তর কীভাবে দেয় সে সম্পর্কে কিছু বিশদ সরবরাহ করে আপনার উত্তরটি বিশদভাবে বিবেচনা করা উচিত।
forsvarir

1
@ রামকুমার এটি ব্যবহারকারীকে বাড়িতে নিয়ে যায়। যা স্পষ্টতই 10000 কেসগুলির মধ্যে কেবলমাত্র একক কেস যা অনপস, অনস্টপ বা অনডাস্ট্রয়ে কল পেতে পারে।
tony9099

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