4

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

我试图执行this answer创建我自己的动作,然后将动作设置为意图,但我不确定如何使用它以及另外需要什么 - 例如向Manifest中添加某些内容。

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

这里是我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); 
    } 

} 

回答

6

所以这实际上是很容易的。希望我可以帮助其他人看到这一点。

我发送一个动作到这个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功能我如果所需的片段仍在内存中,则替换该片段(意味着用户早些时候在那里并且尚未被销毁),或者创建一个新的片段。

+0

如何检查片段是否在内存中? – MohsinSyd

+2

String [] frag_tags = {“fragment1”,“fragment2”,“fragment3”}; Fragment frag = getSupportFragmentManager()。findFragmentByTag(frag_tags [fragNumber]); (TAG,“Frag is in memory:”+ String.valueOf(fragNumber));或者, \t \t \t transaction.replace(R.id.lin_main_container,frag,frag_tags [fragNumber]); (TAG,“Recreating frag:”+ String.valueOf(fragNumber));其中, } – marienke

+0

为什么我的操作为空? –

相关问题