অভিপ্রায় - যদি কার্যকলাপ চলমান থাকে তবে এটিকে সামনে আনুন, অন্যথায় একটি নতুন শুরু করুন (বিজ্ঞপ্তি থেকে)


129

আমার অ্যাপ্লিকেশনটিতে বিজ্ঞপ্তি রয়েছে, যা - স্পষ্টত - কোনও পতাকা ছাড়াই প্রতিবার একটি নতুন ক্রিয়াকলাপ শুরু করে তাই আমি একে অপরের শীর্ষে একাধিক একই ক্রিয়াকলাপ চালিয়ে যাচ্ছি যা ঠিক ভুল।

আমি যা করতে চাই তা হ'ল বিজ্ঞপ্তিগুলির মধ্যে উল্লিখিত ক্রিয়াকলাপটি ইতিমধ্যে চলমান থাকলে সামনে আনুন, অন্যথায় এটি শুরু করুন।

এখনও অবধি, আমার কাছে যে বিজ্ঞপ্তিটি রয়েছে তার উদ্দেশ্য / মুলতুবি

private static PendingIntent prepareIntent(Context context) {
    Intent intent = new Intent(context, MainActivity.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);

    return PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
}

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

উত্তর:


131

আপনি এটি ব্যবহার করতে পারেন:

<activity 
   android:name=".YourActivity"
   android:launchMode="singleTask"/>

যা এর মতো কাজ করবে "singleInstance"তবে এতে অদ্ভুত অ্যানিমেশন থাকবে না।


15
+1, আপনার গ্রহণযোগ্য উত্তর হওয়া উচিত। পার্থক্যগুলি এখানে রয়েছে: developer.android.com/guide/topics/manifest/…
ব্যবহারকারী 1032613

1
স্পষ্ট করতে, অ্যাপে আপনার একাধিক ক্রিয়াকলাপ থাকলে সিঙ্গলটাস্ক ব্যবহার করুন এবং আপনার যদি কেবল একটি ক্রিয়াকলাপ থাকে তবে এটি পিতামাতা, একক ইনস্ট্যান্স।
হিমশীতল

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

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

@ জাভেনিসিপিপিএমসি গোওয়ান যা পুরোপুরি আলাদা প্রশ্নের মতো মনে হচ্ছে, আমি আপনাকে পরামর্শ দিচ্ছি যে এটি নিজের প্রশ্ন হিসাবে, দুর্ভাগ্যক্রমে আমি উত্তরটি জানি না।
ফ্রাঙ্কো

46

আমি মনে করি এটি করার এবং সহজ পদ্ধতিতে করার সর্বোত্তম উপায় হ'ল ক্রিয়াকলাপটি সাধারণত শুরু করা, তবে সেই ক্রিয়াকলাপটি singleInstanceসম্পত্তি সহ সেট করে । এটির সাহায্যে আপনি এখনই ক্রিয়াকলাপটি উভয় ইস্যুতে পৌঁছে যাচ্ছেন, ক্রিয়াকলাপটি সর্বদা সামনে রেখে, এবং কোনও ক্রিয়াকলাপ না থাকলে ওএসকে স্বয়ংক্রিয়ভাবে একটি নতুন তৈরি করতে দেয় বা বিদ্যমান ক্রিয়াকলাপটি সামনে না আনলে (ধন্যবাদ ধন্যবাদ singleInstanceসম্পত্তি)।

এইভাবে কোনও ক্রিয়াকলাপটি একক উদাহরণ হিসাবে ঘোষণা করা হয়:

<activity 
   android:name=".YourActivity"
   android:launchMode="singleInstance"/>

সিঙ্গলআইন্সট্যান্সের মাধ্যমে প্রবর্তন করার সময় একটি চপি অ্যানিমেশন এড়াতে আপনি "সিঙ্গলটাস্ক" এর পরিবর্তে ব্যবহার করতে পারেন, উভয়ই একই রকম তবে গুগলের ডকুমেন্টেশন অনুসারে পার্থক্যটি এখানে ব্যাখ্যা করা হয়েছে:

<activity 
   android:name=".YourActivity"
   android:launchMode="singleTask"/>

সিঙ্গলআইনস্ট্যান্স "সিঙ্গলটাস্ক" এর সমান, সিস্টেম ব্যতীত অন্য কোনও ক্রিয়াকলাপটি টাস্কটি ধারণ করে না। ক্রিয়াকলাপটি সর্বদা তার কার্যের একক এবং একমাত্র সদস্য।

আশাকরি এটা সাহায্য করবে.

শুভেচ্ছা সহ!


4
এটি কাজ করছে বলে মনে হচ্ছে, তবে এখন আমি
সিঙ্গেল ইন্টেন্ট মেইনএকটিভিটি

আমি প্রতিবারই একটি নতুন ক্রিয়াকলাপ চালু করি তবে এর অন্যান্য চলমান দৃষ্টান্তগুলি কীভাবে পরিষ্কার করা যায়, তা কি সম্ভব হবে?
urSus

ঠিক আছে, আমি মনে করি না আপনি যে অ্যানিমেশনটির উল্লেখ করেছেন তার "সিঙ্গেলআইনস্ট্যান্স" সম্পত্তিটির সাথে কোনও সম্পর্ক আছে, এটি যা যা করে তা বিদ্যমান উদাহরণটিকে পুনরায় ব্যবহার করছে, সম্ভবত আপনি যে অ্যানিমেশনটির কথা বলছেন তা সম্পূর্ণ ভিন্ন সমস্যা ...
মার্টিন কাজারস

1
ভাল আমি এখনই এটি পরীক্ষা করছি এবং এটি করে। যদি আমি সমস্ত অভিপ্রায়িত পতাকাগুলি সরিয়ে ফেলি এবং কেবল ম্যানিফেস্টে লঞ্চমোড = "সিঙ্গলইনস্ট্যান্স" সেট করি তবে অদ্ভুত অ্যানিমেশনটি যদি আমি এটি সরিয়ে ফেলি তবে এটি স্বাভাবিক অবস্থায় ফিরে আসে
urSus

হ্যাঁ, অ্যান্ড্রয়েড ডকুমেন্টেশন অনুসারে, মনে হচ্ছে "থিম" অ্যানিমেশনটি এখনকার মতো স্বাভাবিকভাবে আর নেই কারণ ক্রিয়াকলাপটি আরম্ভ করা হচ্ছে না, কেবল পুনরায় ব্যবহার করা হচ্ছে ...
মার্টিন ক্যাজারস

26

আমি মনে করি আপনার যা প্রয়োজন তা singleTop Activityকেবল একটি singleTaskবা এর চেয়ে বেশি singleInstance

<activity android:name=".MyActivity"
          android:launchMode="singleTop"
          ...the rest... >

কি ডকুমেন্টেশন বলছেন পুরোপুরি আপনার প্রয়োজন অনুসারে না:

[...] singleTopনতুন অভিপ্রায় পরিচালনা করতে কোনও ক্রিয়াকলাপের একটি নতুন উদাহরণও তৈরি করা যেতে পারে। যাইহোক, যদি লক্ষ্য টাস্কটির স্ট্যাকের শীর্ষে ক্রিয়াকলাপের ইতিমধ্যে কোনও বিদ্যমান উদাহরণ থাকে, তবে সেই উদাহরণটি নতুন অভিপ্রায়টি গ্রহণ করবে (একটি onNewIntent()কলে); একটি নতুন উদাহরণ তৈরি করা হয় না। অন্যান্য পরিস্থিতিতে - উদাহরণস্বরূপ, যদি ক্রিয়াকলাপের কোনও বিদ্যমান উদাহরণ singleTopলক্ষ্যযুক্ত কার্যে থাকে তবে স্ট্যাকের শীর্ষে নয়, বা যদি এটি স্ট্যাকের শীর্ষে থাকে তবে লক্ষ্য কার্যে নয় - একটি নতুন উদাহরণস্বরূপ তৈরি করা হবে এবং স্ট্যাকের উপর ধাক্কা।

তার উপরে (কোনও পাং উদ্দেশ্য নয়), আপনার ঠিক আমারও একই চাহিদা ছিল। launchModeএগুলি বাস্তবে অনুশীলনে কীভাবে আচরণ করে তা নির্ধারণ করার জন্য আমি সমস্ত পতাকা পরীক্ষা করেছিলাম এবং ফলস্বরূপ এটির singleTopজন্য সর্বোত্তম: অদ্ভুত অ্যানিমেশন নেই, সাম্প্রতিক অ্যাপ্লিকেশন তালিকায় একবার অ্যাপ্লিকেশন প্রদর্শিত হয়েছে ( singleInstanceএটি সত্য না হওয়ার কারণে এটি দু'বার প্রদর্শন করে unlike টি অন্য কোনও Activityব্যক্তিকে তার কাজের অংশ হতে দেবেন না ) এবং লক্ষ্য Activityইতিমধ্যে উপস্থিত রয়েছে বা না থাকুক যথাযথ আচরণ করা ।


2
শুক্রবার রাত ১০ টা অবধি কাজ করুন এবং এটিই আমি চাই ... দুঃখ বিকাশকারী জীবন।
felixwcf

আমার অনেক সময় সাশ্রয়! ধন্যবাদ!
hetsgandhi

13

এটি পুরানো থ্রেড, তবে যারা এখনও উত্তর খুঁজছেন তাদের জন্য, আমার সমাধানটি এখানে is এটি খাঁটি কোডে প্রকাশিত সেটিংস ছাড়াই রয়েছে:

private static PendingIntent prepareIntent(Context context) {
  Intent intent = new Intent(context, MainActivity.class);
  intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP);      
  return PendingIntent.getActivity(context, NON_ZERO_REQUEST_CODE, intent, 
    PendingIntent.FLAG_UPDATE_CURRENT);
}

এখানে FLAG_ACTIVITY_SINGLE_TOP বিদ্যমান ক্রিয়াকলাপটি খোলে যদি এটি কার্য স্ট্যাকের শীর্ষে থাকে। এটি শীর্ষে না থাকলেও স্ট্যাকের অভ্যন্তরে, FLAG_ACTIVITY_CLEAR_TOP লক্ষ্য ক্রিয়াকলাপের শীর্ষস্থানীয় সমস্ত ক্রিয়াকলাপ সরিয়ে এটি প্রদর্শন করবে। ক্রিয়াকলাপটি যদি কার্য স্ট্যাকটিতে না থাকে তবে নতুন একটি তৈরি করা হবে। একটি উল্লেখযোগ্যভাবে গুরুত্বপূর্ণ পয়েন্টটি উল্লেখ করতে হবে - পেন্ডিং ইন্টেন্ট.জেটঅ্যাক্টিভিটি () এর দ্বিতীয় প্যারামিটার, অর্থাৎ অনুরোধকোডের নন-শূন্য মান থাকতে হবে (আমি এটি আমার স্নিপেটে NON_ZERO_REQUEST_CODE বলেও ডাকলাম), অন্যথায় inte অভিপ্রায়িত পতাকাগুলি কাজ করবে না। এটি কেন যেমন আছে তা আমার কোনও ধারণা নেই। ফ্ল্যাগ FLAG_ACTIVITY_SINGLE_TOP অ্যান্ড্রয়েডের সাথে বিনিময়যোগ্য: ম্যানিফেস্টে লঞ্চমোড = "সিঙ্গলটপ" ক্রিয়াকলাপ ট্যাগে।


এই পতাকাগুলি নিয়ে কয়েক ঘন্টা ধরে লড়াই করা এবং ভাবছিলাম কেন আমার উদ্দেশ্য ফ্ল্যাগগুলি পরিবর্তন করা যায় না। নন-শূন্য রিকোয়েস্ট কোড ... উল্লেখ করার জন্য একটি অত্যন্ত গুরুত্বপূর্ণ পয়েন্ট !!! এখন কাজ! ধন্যবাদ!
সর্বাধিক পাওয়ার

9

আমি জানি এটি পুরানো, তবে উপরের কিছুই আমার আবেদনের সাথে মানানসই ছিল না।

প্রকাশ এবং অন্যান্য কনফিগারেশন পরিবর্তন না করেই, আপনার অ্যাপ্লিকেশনটিকে সামনে ফিরিয়ে আনার কোড - বা এটি বন্ধ হয়ে গেলে এটি খোলার জন্য এখানে কোড is

Intent notificationIntent = context.getPackageManager().getLaunchIntentForPackage(context.getPackageName());
notificationIntent.setPackage(null); // The golden row !!!
notificationIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);

এটাই আসল উত্তর!
আজিজবিকিয়ান

2
না, এটি কোনও কাজ করছে না - এটি বর্তমানের উপরে একটি নতুন ক্রিয়াকলাপ যুক্ত করে।
টব্লিউগ

3

আমি এটি চেষ্টা করেছিলাম এবং আইডিই কোডটি সম্পর্কে অভিযোগ করা সত্ত্বেও এটি কাজ করেছিল

Intent notificationIntent = new Intent(THIS_CONTEXT, MainActivity.class);
    notificationIntent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
    PendingIntent intent = PendingIntent.getActivity(THIS_CONTEXT, 0, notificationIntent, Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);

    NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(THIS_CONTEXT)
            .setSmallIcon(R.drawable.cast_ic_notification_0)
            .setContentTitle("Title")
            .setContentText("Content")
            .setContentIntent(intent)
            .setPriority(PRIORITY_HIGH) //private static final PRIORITY_HIGH = 5;
            .setAutoCancel(true)
            /*.setDefaults(Notification.DEFAULT_SOUND | Notification.DEFAULT_VIBRATE | Notification.DEFAULT_LIGHTS)*/;
    NotificationManager mNotificationManager = (NotificationManager) THIS_CONTEXT.getSystemService(Context.NOTIFICATION_SERVICE);
    mNotificationManager.notify(0, mBuilder.build());

2
<ক্রিয়াকলাপ অ্যান্ড্রয়েড: নাম = "Mainএইনএ্যাকটিভিটি" অ্যান্ড্রয়েড: লঞ্চমোড = "সিঙ্গলটাস্ক">
নাদ

Intent.FLAG_ACTIVITY_REORDER_TO_FRONTজন্য একটি বৈধ পতাকা নয়PendingINtent.getActivity
RDS

@rds আপনি কি উত্সটি লিঙ্ক করতে পারেন?
লুই সিএডি

@ লুইসক্যাড আমি দুঃখিত, আমার আর উত্স কোডে অ্যাক্সেস নেই
nada

@ আরআরএস আমি উত্স কোডের জন্য জিজ্ঞাসা করছি না, তবে আপনি যেখানে পড়েছেন তার লিঙ্কের জন্য এটি Intent.FLAG_ACTIVITY_REORDER_TO_FRONTহিসাবে ব্যবহারের সময় কোনও বৈধ পতাকা নয় PendingIntent। অথবা সম্ভবত আপনি বোঝাতে চেয়েছেন যে এটি getActivityপদ্ধতিতে পাস করার বৈধ নয় , তবে এটি Intentপতাকা হিসাবে ব্যবহার করার জন্য বৈধ যা পরে এটি হিসাবে ব্যবহৃত হয় PendingIntent?
লুই সিএডি

2

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

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

শুধুমাত্র এপিআই 11 +


0

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

final Intent notificationIntent = new Intent(context, YourActivity.class);
notificationIntent.setAction(Intent.ACTION_MAIN);
notificationIntent.addCategory(Intent.CATEGORY_LAUNCHER);
notificationIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.