使用应用程序 Xamarin 时继续在后台执行服务 Android
Continue execution of services in background while using app Xamarin Android
当用户登录移动应用程序时,我有一些数据要插入数据库。以及我也有一些其他服务调用,这使我的应用程序登录最糟糕。
所以在这里我想知道如何立即登录并在后台继续执行其他数据服务。
但是我正在进行 async
调用,但似乎不起作用。
我打的服务电话是在后台 运行 吗?或者我可以把它做得更面糊
private async Task InsertPushKeys()
{
foreach (var item in SISConst.Mychildren)
{
pushInfo.OrganizationId = Convert.ToInt64(item.OrganizationID);
pushInfo.OsType = "Android";
pushInfo.ServerkeyPush = SISConst.LmgKey;
var ignore = await logDAL.InsertPushInfo(pushInfo);
}
}
下行执行服务。
var ignore = await logDAL.InsertPushInfo(pushInfo);
编辑 1: 这些服务我在登录按钮中以相同的顺序调用
_btnSignUp.Click += async (s, e) =>
{
var loggedInUser = await uLogin.UserLogin(_inputName.Text.Trim(), _inputPassword.Text);
Task.Run(async () => { mychildList = await uLogin.BindMychildrenGridData(result.UserID); }).Wait();
await DeletePushKeys(loggedInUser.UserID);
InsertPushKeys();
};
这就是您要找的。服务是由 Android 框架提供的结构,可以完全满足您的需求。有关详细信息,请查看 -
http://www.vogella.com/tutorials/AndroidServices/article.html
TLDR :将您的 API 调用放入服务的 onCreate()
中,将 return START_STICKY
放入服务的 onStartCommand()
中。不要忘记在服务实例上调用 startService()
。
在 Task.Run
中调用您的服务而不使用 await 关键字。 Await 控制直到它完成整个执行。它可能会警告您使用 await 关键字,但您可以忽略它。
Task.Run(async () =>
{
InsertPushKeys();
});
& 不要尝试在方法结束时使用 .Wait()
(直到你需要它)它正在暂停你的执行。
Android 提供 JobService Class,您可以在其中从 JobScheduler Class 安排 JobService。 JobScheduler 运行 是后台服务,您可以继续登录。
您可以在此处找到一个 Xamarin 示例:
https://blog.xamarin.com/replacing-services-jobs-android-oreo-8-0/
创建一个 JobService class 并在 OnStartJob 函数中添加 InsertPushKeys 代码。
确保在新线程上启动它。
OnStartJob(JobParameters parameters){
new Thread(new Runnable() {
public void run() {
await InsertPushKeys();
}
}).start();
}
现在使用 JobInfo Class 构建作业,如上所示 link:
ComponentName componentName = new ComponentName(this, MyJobService.class);
JobInfo jobInfo = new JobInfo.Builder(12, componentName)
.setRequiresCharging(true)
.setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED)
.build();
最后,您可以安排您的工作,它将在 android 之前执行。
JobScheduler jobScheduler = (JobScheduler)getSystemService(JOB_SCHEDULER_SERVICE);
int resultCode = jobScheduler.schedule(jobInfo);
if (resultCode == JobScheduler.RESULT_SUCCESS) {
Console.WriteLine(TAG, "Job scheduled!");
} else {
Console.WriteLine(TAG, "Job not scheduled");
}
确保 运行 任务在不同的线程上。
当用户登录移动应用程序时,我有一些数据要插入数据库。以及我也有一些其他服务调用,这使我的应用程序登录最糟糕。 所以在这里我想知道如何立即登录并在后台继续执行其他数据服务。
但是我正在进行 async
调用,但似乎不起作用。
我打的服务电话是在后台 运行 吗?或者我可以把它做得更面糊
private async Task InsertPushKeys()
{
foreach (var item in SISConst.Mychildren)
{
pushInfo.OrganizationId = Convert.ToInt64(item.OrganizationID);
pushInfo.OsType = "Android";
pushInfo.ServerkeyPush = SISConst.LmgKey;
var ignore = await logDAL.InsertPushInfo(pushInfo);
}
}
下行执行服务。
var ignore = await logDAL.InsertPushInfo(pushInfo);
编辑 1: 这些服务我在登录按钮中以相同的顺序调用
_btnSignUp.Click += async (s, e) =>
{
var loggedInUser = await uLogin.UserLogin(_inputName.Text.Trim(), _inputPassword.Text);
Task.Run(async () => { mychildList = await uLogin.BindMychildrenGridData(result.UserID); }).Wait();
await DeletePushKeys(loggedInUser.UserID);
InsertPushKeys();
};
这就是您要找的。服务是由 Android 框架提供的结构,可以完全满足您的需求。有关详细信息,请查看 -
http://www.vogella.com/tutorials/AndroidServices/article.html
TLDR :将您的 API 调用放入服务的 onCreate()
中,将 return START_STICKY
放入服务的 onStartCommand()
中。不要忘记在服务实例上调用 startService()
。
在 Task.Run
中调用您的服务而不使用 await 关键字。 Await 控制直到它完成整个执行。它可能会警告您使用 await 关键字,但您可以忽略它。
Task.Run(async () =>
{
InsertPushKeys();
});
& 不要尝试在方法结束时使用 .Wait()
(直到你需要它)它正在暂停你的执行。
Android 提供 JobService Class,您可以在其中从 JobScheduler Class 安排 JobService。 JobScheduler 运行 是后台服务,您可以继续登录。 您可以在此处找到一个 Xamarin 示例: https://blog.xamarin.com/replacing-services-jobs-android-oreo-8-0/
创建一个 JobService class 并在 OnStartJob 函数中添加 InsertPushKeys 代码。 确保在新线程上启动它。
OnStartJob(JobParameters parameters){
new Thread(new Runnable() {
public void run() {
await InsertPushKeys();
}
}).start();
}
现在使用 JobInfo Class 构建作业,如上所示 link:
ComponentName componentName = new ComponentName(this, MyJobService.class);
JobInfo jobInfo = new JobInfo.Builder(12, componentName)
.setRequiresCharging(true)
.setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED)
.build();
最后,您可以安排您的工作,它将在 android 之前执行。
JobScheduler jobScheduler = (JobScheduler)getSystemService(JOB_SCHEDULER_SERVICE);
int resultCode = jobScheduler.schedule(jobInfo);
if (resultCode == JobScheduler.RESULT_SUCCESS) {
Console.WriteLine(TAG, "Job scheduled!");
} else {
Console.WriteLine(TAG, "Job not scheduled");
}
确保 运行 任务在不同的线程上。