Run snippet in Android app from notification bar

How to run a fragment in an Android application from a notification in the notification panel?

I tried to implement this answer to create my own action, and then set the action to intent, but I'm not sure how to use it and what is required additionally - how to add something to the manifest.

I have a notification class that receives a context, a message, and then an action. Then I want to filter out this action to determine which fragment to run, but I do not know how to start the fragment, and not start it.

Here is my Notifications.java class (incomplete):

public class Notifications { private Context mContext; public Notifications(Context context) { this.mContext = context; } public static void notify(Context context, String message, String action) { //Action you invent should include the application package as a prefix — for example: "com.example.project.SHOW_COLOR". action = "my.package.name.here.frag."+action; //Construct a user message. String appName = context.getResources().getString(R.string.app_name); // Use the Notification manager to send notification NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); // Create a notification using android stat_notify_chat icon. Notification notification = new Notification(R.drawable.ic_stat_notification, message, 0); //Sound, lights, vibration. //REMEMBER PERMISSIONS. notification.defaults |= Notification.DEFAULT_SOUND; notification.defaults |= Notification.DEFAULT_VIBRATE; notification.defaults |= Notification.DEFAULT_LIGHTS; // Create a pending intent to open the application when the notification is clicked. //Restart the app. Intent launchIntent = null; //Get the action and based on what the action is, launch the application displaying the appropriate fragment. if (action.equalsIgnoreCase("friend")){ //New friend notification //Launch application displaying the list of friends } if (action.equalsIgnoreCase("article")){ //New article has been posted //Launch application displaying the news feed fragment } if (action.equalsIgnoreCase("points")){ //Points scored notification //Launch application displaying the user profile } if (action.equalsIgnoreCase("redeemable")){ //New redeemable is offered //Launch application displaying the list of redeemables } if (!action.equalsIgnoreCase("friend") && !action.equalsIgnoreCase("article") && !action.equalsIgnoreCase("points") && !action.equalsIgnoreCase("redeemable")){ //Not specific, so launch the application from scratch displaying the activity feed launchIntent = context.getPackageManager().getLaunchIntentForPackage(context.getPackageName()); } if(action != null && launchIntent != null){ launchIntent.setAction(action); } // Set the notification and register the pending intent to it notification.setLatestEventInfo(context, appName, message, pendingIntent); // Trigger the notification notificationManager.notify(0, notification); } } 
+4
source share
1 answer

So it was pretty easy. Hope I can help someone else see this too.

I am sending the action of this notify function. I am adding this action to my intent to trigger the action. In my case, I open the launch because all fragments are loaded from this action based on what the user is doing. Therefore, I set the action using setAction , and I use this action in the action, as shown below.

My Notifications.java class has changed to this:

 public static void notify(Context context, String message, String action) { action = action.toUpperCase(); // Create a pending intent to open the the application when the notification is clicked. //Restart the app. Intent launchIntent = context.getPackageManager().getLaunchIntentForPackage(context.getPackageName()); if(action != null && launchIntent != null){ launchIntent.setAction(action); } PendingIntent pendingIntent = PendingIntent.getActivity(context, -1, launchIntent, PendingIntent.FLAG_UPDATE_CURRENT); notification.when = System.currentTimeMillis(); notification.flags |= Notification.FLAG_AUTO_CANCEL; // Set the notification and register the pending intent to it notification.setLatestEventInfo(context, appName, message, pendingIntent); // Trigger the notification notificationManager.notify(0, notification); } 

And then in my activity , from where I load the fragments, I get the action and filter it:

 Intent intent = getIntent(); try{ String action = intent.getAction().toUpperCase(); if(action != null){ if(action.equalsIgnoreCase(getResources().getString(R.string.notification_action_friend))){ goFrag(getResources().getInteger(R.integer.FRAG_A_INT)); } if(action.equalsIgnoreCase(getResources().getString(R.string.notification_action_article))){ goFrag(getResources().getInteger(R.integer.FRAG_B_INT)); } if(action.equalsIgnoreCase(getResources().getString(R.string.notification_action_points))){ goFrag(getResources().getInteger(R.integer.FRAG_C_INT)); } if(action.equalsIgnoreCase(getResources().getString(R.string.notification_action_redeemable))){ goFrag(getResources().getInteger(R.integer.FRAG_D_INT)); } if(action.equalsIgnoreCase(getResources().getString(R.string.notification_action_dance))){ goFrag(getResources().getInteger(R.integer.FRAG_E_INT)); } }else{ Log.d(TAG, "Intent was null"); } }catch(Exception e){ Log.e(TAG, "Problem consuming action from intent", e); } 

In my goFrag function goFrag I replace the fragment if the required fragment is still in memory (which means that the user was there before and it has not yet been destroyed), or I create the required new fragment.

+6
source

Source: https://habr.com/ru/post/1479093/


All Articles