如何从另一个项目开始 Activity

How to start Activity from another project

我正在为 android 和 windows-phone 开发天气应用程序。所以我在"Weather.Api(Portable)"中的另一个项目中写了公共代码在"Parsing Class"中。 "Weather.Droid" 用于 Android.

ParsingClass代码如下:

    public static string tempGlobal;
    public static string cityTextGlobal;
    private static string GovnoTemperature;

    public async  Task<string> dataByCity(string city)
    {
        var url = "http://api.openweathermap.org/data/2.5/weather?q=" + city + "&units=metric&APPID="+AppID;

        //ТОРМОЗИТ ЗДЕСЬ / BRAKES HERE
        await FetchAsync(url);
        return city;
    }

    public async Task<double> Data_down(double lat, double lon)
    {

        var url = String.Format(
          "http://api.openweathermap.org/data/2.5/weather?lat=" + lat + "&lon=" + lon + "&units=metric&APPID=" + AppID);

        //ТОРМОЗИТ ЗДЕСЬ / BRAKES HERE
        await FetchAsync(url);

        return lat;
    }

    public async Task<string> FetchAsync(string url)
    {
        string jsonString;

        using (var httpClient = new System.Net.Http.HttpClient())
        {
            var stream = await httpClient.GetStreamAsync(url);
            StreamReader reader = new StreamReader(stream);
            jsonString = reader.ReadToEnd();
        }

        var json = jsonString;

        JsonValue firstitem = json;
        var mydata = JObject.Parse(json);

        cityTextGlobal = (mydata["name"]).ToString();

        string GovnoData = (mydata["main"]).ToString();

        //spliting string
        string[] values = GovnoData.Split(',');
        for (int i = 0; i < values.Length; i++)
        {
            values[i] = values[i].Trim();
            if (i == 0)
            {
                //tempGlobal = values[i];
                GovnoTemperature = values[i];
            }
        }
        tempGlobal = null;
        foreach (char c in GovnoTemperature)
        {
            if (c == '.')
            {
                break;
            }
            if (c == '-' || char.IsDigit(c) == true || c == '.')
            {
                tempGlobal += c.ToString();
            }
        }

        return jsonString;
    }
}

public class Coord
{
    public double lon { get; set; }
    public double lat { get; set; }
}

public class Weather
{
    public int id { get; set; }
    public string main { get; set; }
    public string description { get; set; }
    public string icon { get; set; }
}

public class Main
{
    public double temp { get; set; }
    public int pressure { get; set; }
    public int humidity { get; set; }
    public int temp_min { get; set; }
    public int temp_max { get; set; }
}

public class Wind
{
    public double speed { get; set; }
    public double deg { get; set; }
}

public class Clouds
{
    public int all { get; set; }
}

public class Sys
{
    public int type { get; set; }
    public int id { get; set; }
    public double message { get; set; }
    public string country { get; set; }
    public int sunrise { get; set; }
    public int sunset { get; set; }
}

public class RootObject
{
    public Coord coord { get; set; }
    public List<Weather> weather { get; set; }
    public string @base { get; set; }
    public Main main { get; set; }
    public int visibility { get; set; }
    public Wind wind { get; set; }
    public Clouds clouds { get; set; }
    public int dt { get; set; }
    public Sys sys { get; set; }
    public int id { get; set; }
    public string name { get; set; }
    public int cod { get; set; }
}

}

我需要从以下方法启动 "Weather.Droid" 的 MainActivity:

public async Task FetchAsync(string url)

之前returns:

jsonString

我该怎么做?

看来你追求的是依赖注入。在可移植项目中声明一个接口,然后在Droid/iOS/???您支持的项目。

我在 XLabs 社区项目中创建了 IOC 的抽象。 Matt Whetton 写了一些关于如何使用它的非常好的说明:http://www.codenutz.com/getting-started-xamarin-forms-labs-xaml-mvvm-ioc/

以下方法并不理想,但有点不清楚为什么您需要调用 activity 开始至少这会给您一些想法。

便携端:

public class Class1
{
    public static async Task<string> Fetch(string url, Action onComplete = null)
    {
        await Task.Delay(10);


        onComplete?.Invoke();
        return url;
    }
}

在 Android 方面(如果您打算在主屏幕出现之前执行此提取,这将是您的初始屏幕或应用程序):

[Activity(Label = "App5", MainLauncher = true, Icon = "@drawable/icon")]
public class MainActivity : Activity
{
    protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle);

        // Set our view from the "main" layout resource
        SetContentView (Resource.Layout.Main);

        Class1.Fetch("test", () =>
        {
            var intent = new Intent(this, typeof(OtherActivity));
            this.RunOnUiThread(() => StartActivity(intent));
        }).ContinueWith(t =>
        {
            if (t.IsCompleted) Log.Debug("Fetch", t.Result);
        });
    }
}

I need to start MainActivity of "Weather.Droid" from method:

public async Task FetchAsync(string url)

您不能直接从 Droid 项目启动 MainActivity。但正如@SKall 所说,您可以在 FetchAsync 方法中使用 Action<Intent>

//add Action<Intent> as and Intent as parameters
public async Task<string> FetchAsync(string url,Action<Intent> navigationFunc,Intent intent)
{
    string jsonString;
    ...
    navigationFunc(intent);//Invoke the action
    return jsonString;
}

然后在您的 Droid 项目中使用它:

ParsingClass parsing = new ParsingClass();
Intent intent = new Intent(this, typeof(MainActivity));
await parsing.FetchAsync("url", StartActivity, intent);