android之当应用程序在后台时从通知中打开 fragment

webabcd 阅读:213 2025-06-02 22:19:02 评论:0

我正在使用 parse 将 Json 通知推送到带有自定义接收器的应用程序,因为我想导航到应用程序中的不同位置,这取决于我收到的 Json 值,我有 2 个案例要导航:

a) 7

b) 1、2、3、4、5、6

case a 打开一个 activity 并且正常工作。 case b 在 `MainActivity. “这就是问题所在。”

我尝试以正常 Intent 打开 MainActivity,然后用 fragment 替换它的容器。

当我尝试打开案例 b 时,我在此代码段的第三行中得到了 ClassCastException,因为它无法将 BaseClass 上下文转换为 v4分段。 当我只给它属于接收者上下文的 context 时,我得到了同样的异常。

intent = new Intent(context, MainScreen.class); 
Fragment fragment = new NotificationFragment(); 
FragmentTransaction transaction = ((FragmentActivity) context.getApplicationContext()).getSupportFragmentManager().beginTransaction(); 
transaction.replace(R.id.container, fragment).commit(); 

这是个异常(exception):

FATAL EXCEPTION: main 
Process: com.myapp.SomeApp, PID: 9639 
java.lang.RuntimeException: Unable to start receiver com.myapp.SomeApp.Receivers.NotifyReceiver: java.lang.ClassCastException: com.myapp.SomeApp.utils.BaseClass cannot be cast to android.support.v4.app.FragmentActivity 
 at android.app.ActivityThread.handleReceiver(ActivityThread.java:2616) 
 at android.app.ActivityThread.access$1700(ActivityThread.java:151) 
 at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1380) 
 at android.os.Handler.dispatchMessage(Handler.java:102) 
 at android.os.Looper.loop(Looper.java:135) 
 at android.app.ActivityThread.main(ActivityThread.java:5254) 
 at java.lang.reflect.Method.invoke(Native Method) 
 at java.lang.reflect.Method.invoke(Method.java:372) 
 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 
 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 
 at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:114) 
 Caused by: java.lang.ClassCastException: com.myapp.SomeApp.utils.BaseClass cannot be cast to android.support.v4.app.FragmentActivity 
 at com.myapp.SomeApp.Receivers.NotifyReceiver.onReceive(NotifyReceiver.java:52) 
 at android.app.ActivityThread.handleReceiver(ActivityThread.java:2609) 
 at android.app.ActivityThread.access$1700(ActivityThread.java:151)  
 at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1380)  
 at android.os.Handler.dispatchMessage(Handler.java:102)  
 at android.os.Looper.loop(Looper.java:135)  
 at android.app.ActivityThread.main(ActivityThread.java:5254)  
 at java.lang.reflect.Method.invoke(Native Method)  
 at java.lang.reflect.Method.invoke(Method.java:372)  
 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)  
 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)  
 at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:114)  

这是完整的接收者代码:

public class NotifyReceiver extends BroadcastReceiver { 
 
private String title, itemID, notifyType; 
private int id; 
 
@Override 
public void onReceive(Context context, Intent intent) { 
 
    if (intent != null) { 
        try { 
            String response = intent.getExtras().getString("com.parse.Data"); 
 
            JSONObject data = new JSONObject(response); 
            itemID = data.getString("ItemID"); 
            notifyType = data.getString("NotificationTypeID"); 
            title = data.getString("alert"); 
 
            id = Integer.parseInt(notifyType); 
        } catch (JSONException e) { 
            Log.e("NotifyReceiver", e.getMessage()); 
        } 
    } 
    if (id == 7) { 
        intent = new Intent(context, TendersActivity.class); 
    } else { 
        intent = new Intent(context, MainScreen.class); 
        Fragment fragment = new NotificationFragment(); 
        FragmentTransaction transaction = 
                ((FragmentActivity) context.getApplicationContext()) 
                        .getSupportFragmentManager().beginTransaction(); 
        transaction.replace(R.id.container, fragment).commit(); 
    } 
    PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0); 
 
    Notification notify = new NotificationCompat.Builder(context) 
            .setContentTitle(context.getResources().getString(R.string.app_name)) 
            .setContentText(title) 
            .setSmallIcon(R.drawable.ic_stat_notify) 
            .setContentIntent(pendingIntent) 
            .setVibrate(new long[]{250, 250, 250, 250}) 
            .setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)) 
            .setAutoCancel(true) 
            .build(); 
 
    NotificationManager manager = (NotificationManager) 
            context.getSystemService(Context.NOTIFICATION_SERVICE); 
    manager.notify(0, notify); 
    } 
} 

请您参考如下方法:

请用此代码替换您的 else 部分:

else { 
        intent = new Intent(context, MainScreen.class); 
        resultIntent.putExtra("From", "notifyFrag"); 
    } 

并在您的 MainScreen.class 中检查是否使用此代码从通知键调用的 Activity :

String type = getIntent().getStringExtra("From"); 
if (type != null) { 
    switch (type) { 
        case "notifyFrag": 
            Fragment fragment = new NotificationFragment(); 
            FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); 
            transaction.replace(R.id.container, fragment).commit(); 
            break; 
    } 
} 

希望这会有所帮助。


标签:Android
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号