通过单击“前台服务通知”显示当前活动

时间:2019-11-21 08:44:51

标签: java c# android xamarin android-8.0-oreo

如何通过单击“通知”显示“前台服务”活动?当我使用代码时,它将启动新的活动,但是我需要在服务正常运行的活动。这是我的代码(Android Oreo):

 public class APSService : Service
    {
        public static bool isRunning = false;

        public override void OnCreate()
        {
            base.OnCreate();
        }

        public override void OnDestroy()
        {
            isRunning = false;
            base.OnDestroy();
        }



        [return: GeneratedEnum]
        public override StartCommandResult OnStartCommand(Intent intent, [GeneratedEnum] StartCommandFlags flags, int startId)
        {
            isRunning = true;
            byte[] input = intent.GetByteArrayExtra("inputExtra");

            Intent notificationIntent = new Intent(this, Java.Lang.Class.FromType((typeof(MainActivity))));

            PendingIntent pendingIntent = PendingIntent.GetActivity(this,
                0, notificationIntent, 0);

            var builder = new NotificationCompat.Builder(this, MainActivity.CHANNEL_ID)
                .SetContentTitle("APS Service")
                .SetSmallIcon(Resource.Drawable.notifypump)
                .SetContentText("Start program...")
                .SetContentIntent(pendingIntent);

            Notification notification = builder.Build();

            StartForeground(1, notification);

            //do heavy work on background thread

            return StartCommandResult.NotSticky;
        }


        public override IBinder OnBind(Intent intent)
        {
            return null;
        }
    }

在OnCreate的MainActivity中:

 protected override void OnCreate(Bundle savedInstanceState)
        {
            if (!APSService.isRunning)
            {
                createNotificationChannel();
                startService();
            }
            else
            {
                NotificationChannel serviceChannel = new NotificationChannel
                       (
                           CHANNEL_ID,
                           "APS service Channel",
                           NotificationImportance.Default
                       );
                notificationManager = (NotificationManager)GetSystemService(Java.Lang.Class.FromType((typeof(NotificationManager))));
                notificationManager.CreateNotificationChannel(serviceChannel);
                UpdateNotification("Loading...");
                APSService.isRunning = true;

            }
}

希望您能帮助解决此问题。非常感谢。

2 个答案:

答案 0 :(得分:0)

我不清楚您要打开哪个活动

  

如何显示前台服务活动

前景服务独立于您的应用运行

您要在此处启动MainActivity:

Intent notificationIntent = new Intent(this,Java.Lang.Class.FromType((typeof(MainActivity))));

您能在这里弄清楚想做什么吗?

ps:我知道这不是答案,还不能发表评论

答案 1 :(得分:0)

我为此编写了一个演示,这是一个GIF。

enter image description here

您可以通过以下代码来实现此功能。

 [Service]
class MyForegroundService : Service
{
    public const int SERVICE_RUNNING_NOTIFICATION_ID = 10000;

    [return: GeneratedEnum]
    public override StartCommandResult OnStartCommand(Intent intent, [GeneratedEnum] StartCommandFlags flags, int startId)
    {
        CreateNotificationChannel();
        string messageBody = "service starting";
       // / Create an Intent for the activity you want to start
       Intent resultIntent = new Intent(this,typeof(Activity1));
       // Create the TaskStackBuilder and add the intent, which inflates the back stack
       TaskStackBuilder stackBuilder = TaskStackBuilder.Create(this);
       stackBuilder.AddNextIntentWithParentStack(resultIntent);
       // Get the PendingIntent containing the entire back stack
       PendingIntent resultPendingIntent = stackBuilder.GetPendingIntent(0, PendingIntentFlags.UpdateCurrent);
       var notification = new Notification.Builder(this, "10111")
        .SetContentIntent(resultPendingIntent)
        .SetContentTitle("Foreground")
        .SetContentText(messageBody)
        .SetSmallIcon(Resource.Drawable.main)
        .SetOngoing(true)
        .Build();
        StartForeground(SERVICE_RUNNING_NOTIFICATION_ID, notification);
         //do you work
        return StartCommandResult.Sticky;


    }
    public override IBinder OnBind(Intent intent)
    {
        return null;
    }

    void CreateNotificationChannel()
    {
        if (Build.VERSION.SdkInt < BuildVersionCodes.O)
        {
            // Notification channels are new in API 26 (and not a part of the
            // support library). There is no need to create a notification
            // channel on older versions of Android.
            return;
        }

        var channelName = Resources.GetString(Resource.String.channel_name);
        var channelDescription = GetString(Resource.String.channel_description);
        var channel = new NotificationChannel("10111", channelName, NotificationImportance.Default)
        {
            Description = channelDescription
        };

        var notificationManager = (NotificationManager)GetSystemService(NotificationService);
        notificationManager.CreateNotificationChannel(channel);
    }

}

这是我的演示。 https://github.com/851265601/ForegroundServiceDemo