0

我希望我的应用程序成为 PDF 的查看器并发送目标,但不希望它每次都创建新实例。如何在我的 ? 中捕获视图意图操作MainActivity?我试过OnNewIntent()但它没有被调用。只有当应用程序尚未运行时,我才会在OnCreate(). 我错过了什么?

[Activity (Theme = "@style/MainTheme", Label = "MyPdfViewer", Icon = "@drawable/icon", /*MainLauncher = true, --> SplashActivity is now the MainLauncher */LaunchMode = LaunchMode.SingleTop, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
[IntentFilter(new[] { Intent.ActionSend }, Categories = new[] { Intent.CategoryDefault }, DataMimeType = @"application/pdf")]
[IntentFilter(new[] { Intent.ActionView }, Categories = new[] { Intent.CategoryDefault }, DataMimeType = @"application/pdf")]
public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
{
    protected override void OnCreate (Bundle bundle)
    {
        base.OnCreate (bundle);

        LoadApplication (new App ());

        // handle clipboard data "send to" or "view document" actions
        if (Intent.Type == "application/pdf")
        {
            HandleSendOrViewAction();
        }

    }

    protected virtual void OnNewIntent()
    {
        var data = this.Intent.Data;  // <-- never called
        // do similar thing like in HandleSendOrViewAction()
    }

    private bool HandleSendOrViewAction()
    {
        // Get the info from ClipData 
        var pdf = Intent.ClipData.GetItemAt(0);

        // Open a stream from the URI 
        byte[] bytes;
        Stream inputStream;
        if (Intent.Action == Intent.ActionSend)
            inputStream = ContentResolver.OpenInputStream(pdf.Uri);
        else if (Intent.Action == Intent.ActionView)
            inputStream = ContentResolver.OpenInputStream(Intent.Data);
        else
            return false;

        using (StreamReader sr = new StreamReader(inputStream))
        {
            MemoryStream ms = new MemoryStream();
            inputStream.CopyTo(ms);
            bytes = ms.ToArray();
        }

        Services.PdfReceiver.Base64Data = Convert.ToBase64String(bytes);  

        return true;
    }
4

1 回答 1

0

但不希望它每次都创建新实例。

Launch Mode的standardandsingleTop会创建多个实例。如果您不想每次都创建实例,则可以使用singleTaskandsingleInstance代替。

对于singleTop启动模式,您需要知道,如果 Activity 的实例已经存在于目标任务的顶部,系统会通过调用其onNewIntent()方法将 Intent 路由到该实例,而不是创建 Activity 的新实例。如果已经存在的activity的实例不在顶部,它就不会调用onNewIntent()方法。

这就是为什么我建议使用singleTask. 系统在新任务的根部创建活动并将意图路由到它。但是,如果活动的实例已经存在,系统会通过调用其 onNewIntent() 方法将意图路由到现有实例,而不是创建一个新实例。

于 2022-02-15T06:17:31.430 回答