বিজ্ঞপ্তি ক্লিক করুন: ক্রিয়াকলাপ ইতিমধ্যে উন্মুক্ত


164

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

আমি ভেবেছিলাম পতাকাটি দিয়ে FLAG_ACTIVITY_BROUGHT_TO_FRONTবা এটি করতে পারি FLAG_ACTIVITY_REORDER_TO_FRONTতবে এটি আবার খোলার চেষ্টা করে তাই আমার দু'বার ক্রিয়াকলাপ হয়।

এটি আমার কোড:

event_notification = new Notification(R.drawable.icon,
            mContext.getString(R.string.event_notif_message), System.currentTimeMillis()); 
Intent notificationIntent = new Intent(mContext, EventListActivity.class);
notificationIntent.setFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);
sendNotification(event_notification, notificationIntent, mContext.getString(R.string.event_notif_title),
                body, Utils.PA_NOTIFICATIONS_ID);

আমি কি এটি পতাকাগুলির সাথে পরিচালনা করতে পারি বা শ্যাर्डপ্রেফারেন্সে কোনও পরিবর্তনশীল এটি সংরক্ষণ করা আছে কিনা তা যাচাই করার জন্য সঞ্চয় করা উচিত?

ধন্যবাদ!


1
আমি ইন্টেন্ট.সেটফ্লেগগুলি ব্যবহার করি (ইনটেন্ট.এফএলজি_এসিটিভিটি_সিংল_টপ | ইনটেন্ট.এফএলএজি_এসিটিভিটি_নো_হস্তুরি);
আশরাফুল

উত্তর:


298

আপনি যে launchModeবৈশিষ্ট্যটি Activityশুরু করছেন সেটি আপনাকে সেট করতে হবে singleTop। এটি যখন Activityইতিমধ্যে টাস্কের স্ট্যাকের শীর্ষে রয়েছে তখন কোনও নতুন উদাহরণ শুরু করার পরিবর্তে আগত ইনটেন্টগুলি বিদ্যমান ইভেন্টে বিতরণ করা হবে ।

এই যোগ করে স্পষ্ট মধ্যে সম্পন্ন করা হয় android:launchMode="singleTop"করার <activity>উপাদান। সর্বশেষতম অভিপ্রায় অ্যাক্সেস করতে (আপনি যদি এটির সাথে পাস করে এমন কোনও ডেটাতে আগ্রহী হন), onNewIntent()আপনার ওভাররাইড করুন Activity


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

5
ডকুমেন্টেশন পৃষ্ঠাটি বিকাশকারী.অ্যান্ড্রয়েড
গাইড

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

38

Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOPপরিবর্তে পতাকাগুলি সেট করার চেষ্টা করুন ।

FLAG_ACTIVITY_CLEAR_TOP (জোর খনি) এর জন্য ডকুমেন্টেশন থেকে :

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

উদাহরণস্বরূপ, ক্রিয়াকলাপ সমন্বিত একটি কার্য বিবেচনা করুন: ক, বি, সি, ডি যদি ডি স্টার্টঅ্যাক্টিভিটি () কে ক্রিয়াকলাপ বি এর উপাদানটির সাথে সমাধান করে এমন একটি উদ্দেশ্য সহ কল ​​করে তবে সি এবং ডি সমাপ্ত হবে এবং বি প্রদত্ত উদ্দেশ্য গ্রহণ করবে , স্ট্যাকের ফলে এখন রয়েছে: এ, বি।

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


1
এই আমার প্রয়োজন ছিল। শুধু একটি বিবরণ যে আমরা অভিপ্রায় এই পতাকার যোগ করতে হবে যোগ করুন: new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP)
মরতেজা রাস্টগু

6

onNewIntent()বিজ্ঞপ্তি থেকে নতুন ডেটা পরিচালনা করার জন্য ব্যবহার করুন এবং ক্রিয়াকলাপটি রিফ্রেশ করুন।

ইন onNewIntentনতুন অভিপ্রায় থেকে নতুন তথ্য (যা নতুন প্রজ্ঞাপন দ্বারা পরিবেশিত) পেতে এবং ওদের ধরতে, উদাহরণস্বরূপ:

title = intent.getStringExtra("title")

মধ্যে onCreateপূর্বে :)

এটি নতুন বিজ্ঞপ্তি ডেটা সহ উপস্থিত ক্রিয়াকলাপকে রিফ্রেশ করবে।

আপনি এই টিউটোরিয়াল অনুসরণ করতে পারেন


3
Notification.Builder mBuilder =
            new Notification.Builder(this)
            .setSmallIcon(R.drawable.cmplayer)
            .setContentTitle("CoderoMusicPlayer")
            .setContentText("PLayer0!");

    Intent resultIntent = new Intent(this, 

    AndroidBuildingMusicPlayerActivity.class);
        resultIntent.setAction(Intent.ACTION_MAIN);
        resultIntent.addCategory(Intent.CATEGORY_LAUNCHER);

        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0,
                resultIntent, 0);

        mBuilder.setContentIntent(pendingIntent);
        NotificationManager mNotificationManager =
            (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
        mNotificationManager.notify(1, mBuilder.build());

কেবল কোডটি অনুলিপি করুন এবং এটি আপনার প্রধান লঞ্চার ক্রিয়াকলাপে আটকান।

এখানে আসল উত্তর দেওয়া আছে


0

আমি মনে করি এটি কার্যকর করার জন্য আপনার কিছু যুক্তি যুক্ত করা উচিত, সম্ভবত এটি সহায়তা করতে পারে:

উদাহরণস্বরূপ আমার কাছে অ্যাপ্লিকেশনটির একটি স্প্ল্যাশ স্ক্রিন (লঞ্চার এবং MAIN) রয়েছে:

public class SplashScreen extends AppCompatActivity {
    private final int TIME_OUT = 2000;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_splash_screen);

        // Suscribirse al tema Notificaciones
        FirebaseMessaging.getInstance().subscribeToTopic("NOTA");
        if (getIntent().getExtras() != null) {
            if (getIntent().getExtras().size()>1){
                Intent home_activity = new Intent(getApplicationContext(), Home.class);
                home_activity.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                if (getIntent().getExtras() != null) {
                    for (String key : getIntent().getExtras().keySet()) {
                        String value = "" + getIntent().getExtras().getString(key);
                        Log.d("TAG", key + "=" + value);
                        switch (key) {
                            case "url":
                                home_activity.putExtra("url", value);
                                break;
                        }
                    }
                }
                startActivity(home_activity);
                finish();

            }else{
                new Handler().postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        try {
                            Intent home_activity = new Intent(getApplicationContext(), Home.class);
                            home_activity.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                            startActivity(home_activity);
                            finish();
                        } catch (Exception ex) {
                            ex.printStackTrace();
                        }
                    }
                }, TIME_OUT);
            }


        } else {
            new Handler().postDelayed(new Runnable() {
                @Override
                public void run() {
                    try {
                        Intent home_activity = new Intent(getApplicationContext(), Home.class);
                        home_activity.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                        startActivity(home_activity);
                        finish();
                    } catch (Exception ex) {
                        ex.printStackTrace();
                    }
                }
            }, TIME_OUT);
        }

    }

}

এবং আমার ফায়ারবেস সার্ভিসে আমি নিম্নলিখিতগুলি করেছি:

public class FCMessagingService extends FirebaseMessagingService {

    private final String TAG = "PUSH";
    private String body = "";
    private static String _url = "";
    private static int numMessage = 0;

    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        super.onMessageReceived(remoteMessage);

        String from = remoteMessage.getFrom();
        Log.d(TAG, "Mensaje recibido de: " + from);

        if (remoteMessage.getNotification() != null) {
            Log.d(TAG, "Notificación: " + remoteMessage.getNotification().getBody());

            if (remoteMessage.getData().size() > 0) {
                Log.d(TAG, "Data: " + remoteMessage.getData());
                try {
                    JSONObject data = new JSONObject(remoteMessage.getData());
                    String url = data.getString("url");
                    Log.d(TAG, "onMessageReceived: \n" + "Extra Information: " + url);
                    this._url = url;
                    Log.d("_URL",_url);
                    mostrarNotificacion(remoteMessage.getNotification().getTitle(), remoteMessage.getNotification().getBody());
                    mensaje(url, remoteMessage.getNotification().getTitle(), remoteMessage.getNotification().getBody());
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
        }



    }


    private void mensaje(String url, String title, String body){
        boolean acti =  Util.comprobarActivityALaVista(getApplicationContext(), "com.dev.android.subagan.MainActivity");
        if(acti){

            Intent imain = new Intent(MainActivity.URL);

            imain.putExtra("key_url",url);
            imain.putExtra("key_title",title);
            imain.putExtra("key_body",body);

            LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(imain);

        }else{

            Intent ihome = new Intent(Home.URL);

            ihome.putExtra("key_url",url);
            ihome.putExtra("key_title",title);
            ihome.putExtra("key_body",body);
            LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(ihome);

        }

    }




    private void mostrarNotificacion(String title, String body) {

        final int NOTIFICATION_ID = 3000;

        Intent intent = new Intent(this, MainActivity.class);
        intent.putExtra("url",_url);
        intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);


        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent,PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_ONE_SHOT  );



        Uri soundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);

        NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
                .setSmallIcon(R.mipmap.ic_launcher)
                .setContentTitle(title)
                .setContentText(body)
                .setAutoCancel(true)
                .setSound(soundUri)
                .setTicker(body)
                .setContentIntent(pendingIntent);

        NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        notificationManager.notify(0, notificationBuilder.build());

    }

}

0
Intent intent = new Intent(this, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent contentIntent = PendingIntent.getActivity(this, new Random().nextInt(), intent, 0);

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