Próbuję wykonać pierwszą aplikację systemową dla systemu Android dotyczącą geolokalizacji i powiadomień lokalnych. Wyobrażam sobie, że to jest ... Jest podstawowa aktywność MainActivity
. Po uruchomieniu uruchamia usługę TestService
, która w przypadku zmiany współrzędnych przesyła je na serwer, a w odpowiedzi otrzymuje komunikat, który będzie wyświetlany jako powiadomienie lokalne. Mam pewne problemy.Powiadomienia z zakresu geolokacji, usług i lokalnych
Jeśli zamknę aplikację (używając menedżera zadań), usługa zostanie zatrzymana, więc po zmianie współrzędnych nic się nie dzieje. Czego potrzebuję, aby ta usługa działała przez cały czas? Czy to niemożliwe?
Po aktywacji lokalnego powiadomienia uruchamia się
NotifyActivity
, która pokazuje szczegółowe informacje. Tam kliknijbuttonDelete
- to zamknie sięNotifyActivity
i rozpocznieMainActivity
. Ale jeśli później przełączyłem się na ekran systemu operacyjnego (za pomocą przyciskuBack
) iz powrotem (za pomocą menedżera zadań), zamiast "MainActivity" ponownie wyświetli się "NotifyActivity". Dlaczego występuje i jak tego uniknąć?
główną działalność
[Activity(Label = "LocationTest", MainLauncher = true, Icon = "@drawable/icon")]
public class MainActivity : Activity
{
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
SetContentView(Resource.Layout.Main);
var button = FindViewById<Button>(Resource.Id.myButton);
button.Click += delegate {
StartService(new Intent(this, typeof(TestService)));
button.Text = "Started";
};
}
}
usług geolokalizacji
[Service]
public class TestService : Service, ILocationListener
{
// Start service
public override StartCommandResult OnStartCommand(Intent intent, StartCommandFlags flags, int startId)
{
locManager = (LocationManager)GetSystemService(LocationService);
locationCriteria = new Criteria();
locationCriteria.Accuracy = Accuracy.Coarse;
locationCriteria.PowerRequirement = Power.Low;
string locationProvider = locManager.GetBestProvider(locationCriteria, true);
// Preferences.MinTime, for example, 60 (seconds)
// Preferences.MinDist, for example, 100 (meters)
locManager.RequestLocationUpdates(locationProvider, Preferences.MinTime * 1000, Preferences.MinDist, this);
return StartCommandResult.Sticky;
}
public void OnLocationChanged(Location loc)
{
// Send coordinates to the server, receive a response, and show local notification
var msg = new ReceivedMessage(counter++, "Test Title", loc.ToString());
ShowNotification(msg);
}
// show local notification
void ShowNotification(ReceivedMessage msg)
{
var myContainer = new Bundle();
myContainer.PutLong("msg_id", Convert.ToInt64(msg.Id));
myContainer.PutStringArray("msg_data", new [] { msg.Title, msg.Text });
var resultIntent = new Intent(this, typeof(NotifyActivity));
resultIntent.PutExtras(myContainer);
TaskStackBuilder stackBuilder = TaskStackBuilder.Create(this);
stackBuilder.AddParentStack(Java.Lang.Class.FromType(typeof(NotifyActivity)));
stackBuilder.AddNextIntent(resultIntent);
PendingIntent resultPendingIntent = stackBuilder.GetPendingIntent(Convert.ToInt32(msg.Id), PendingIntentFlags.UpdateCurrent);
Notification.Builder builder = new Notification.Builder(this)
.SetDefaults(NotificationDefaults.Sound | NotificationDefaults.Vibrate)
.SetAutoCancel(true)
.SetContentIntent(resultPendingIntent)
.SetContentTitle(msg.Title)
.SetContentText(msg.Text)
.SetSmallIcon(Resource.Drawable.Icon);
var nm = (NotificationManager)GetSystemService(NotificationService);
nm.Notify(Convert.ToInt32(msg.Id), builder.Build());
}
}
lokalne powiadomienia
[Activity(Label = "NotifyActivity")]
public class NotifyActivity : Activity
{
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
SetContentView(Resource.Layout.NotifyActivity);
var msg_id = Intent.Extras.GetLong("msg_id");
var msg_data = Intent.Extras.GetStringArray("msg_data");
FindViewById<TextView>(Resource.Id.textTitle).Text = msg_data[0];
FindViewById<TextView>(Resource.Id.textDescription).Text = msg_data[1];
FindViewById<Button>(Resource.Id.buttonDelete).Click += delegate {
StartActivity(typeof(MainActivity));
Finish();
};
}
}
Przykład projekt here
Sądzę, że jesteś trochę w błędzie na obu kontach. Po pierwsze, nie sądzę, że OP mówi o sile zamykającej proces, myślę, że odnoszą się one do przesuwania aplikacji z ostatniej listy aplikacji, która powinna tylko zamykać i usuwać ten stos zadań, a nie zatrzymywać całego procesu. Po drugie, w xamarin czynności są deklarowane przy użyciu atrybutów na samych klasach aktywności. Następnie są one później (podczas kompilacji) automatycznie umieszczane w manifeście. – irreal