代码之家  ›  专栏  ›  技术社区  ›  marienke

从通知栏启动我的Android应用程序中的片段

  •  6
  • marienke  · 技术社区  · 11 年前

    如何从通知栏中的通知启动Android应用程序中的片段?

    我已经试着实现 this answer 创建我自己的动作,然后将动作设置为意图,但我不确定如何使用它,以及额外需要什么——比如向清单中添加一些东西。

    我有一个通知类,它接收上下文、消息和操作。然后,我想过滤该操作,以确定要启动哪个片段,但我不知道如何启动片段,而不是启动活动。

    这是我的Notifications.java类(不完整):

    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's 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);
        }
    
    }
    
    1 回复  |  直到 7 年前
        1
  •  7
  •   David Passmore Venkateshwaran Thamilselvan    10 年前

    所以这其实很容易。希望我也能帮助别人看到这一点。

    我为此发送了一个操作 notify 作用我将该动作添加到我的 intent 启动活动。在我的情况下,我打开启动活动,因为所有片段都是根据用户的操作从该活动中加载的。所以我用 setAction 我在下面的活动中使用这个动作。

    我的 Notifications.java 类更改为:

    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);
    }
    

    然后在我的 activity 从我加载片段的地方,我得到动作并过滤它:

    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);              
        }
    

    在我的 goFrag 如果所需的片段仍在内存中(这意味着用户之前就在那里,但它还没有被销毁),或者我创建一个所需的新片段,那么我会替换该片段。