मैं भौगोलिक स्थान और स्थानीय अधिसूचनाओं से संबंधित एंड्रॉइड के लिए अपना पहला सिस्टम एप्लिकेशन बनाने की कोशिश कर रहा हूं। मुझे इसकी कल्पना है ... मूल गतिविधि MainActivity
है। शुरू करने के बाद यह एक सेवा TestService
लॉन्च करता है जो समन्वयक परिवर्तन के मामले में उन्हें सर्वर पर भेजता है, और उत्तर में कुछ संदेश प्राप्त होता है जो स्थानीय अधिसूचना के रूप में प्रदर्शित होगा। और मुझे कुछ समस्याएं हैं।भौगोलिक स्थान, सेवा और स्थानीय सूचनाएं
यदि मैं एप्लिकेशन को बंद करता हूं (टास्क मैनेजर का उपयोग करके) तो सेवा बंद हो जाएगी, इसलिए निर्देशांक बदलने के बाद कुछ भी नहीं होता है। मुझे उस सेवा को हर समय काम करने की क्या ज़रूरत है? या यह असंभव है?
स्थानीय अधिसूचना के सक्रियण के बाद यह
NotifyActivity
लॉन्च करता है जो विस्तृत जानकारी दिखाता है। वहां मैंbuttonDelete
पर क्लिक करता हूं - यहNotifyActivity
बंद कर देगा औरMainActivity
प्रारंभ करेगा। लेकिन अगर उसके बाद मैं ओएस स्क्रीन पर स्विच करता हूं (Back
बटन का उपयोग करके) और वापस (टास्क मैनेजर का उपयोग करके) 'MainActivity' के बजाय फिर से 'NotifyActivity' प्रदर्शित किया जाएगा। ऐसा क्यों होता है और इससे कैसे बचें?
MainActivity
[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";
};
}
}
जियोलोकेशन सेवा
[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());
}
}
स्थानीय सूचनाएं
[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();
};
}
}
उदाहरण परियोजना here
मुझे लगता है कि आप दोनों खातों पर कुछ गलत हैं। सबसे पहले, मुझे नहीं लगता कि ओपी प्रक्रिया को बंद करने के बल के बारे में बात कर रहा है, मुझे लगता है कि वे हालिया ऐप सूची से ऐप को स्वाइप करने का जिक्र कर रहे हैं, जो केवल उस कार्य स्टैक को बंद और हटा देना चाहिए, पूरी प्रक्रिया को रोकना नहीं चाहिए। दूसरा, xamarin में गतिविधियां गतिविधि कक्षाओं पर विशेषताओं का उपयोग करके घोषित की जाती हैं। वे बाद में (संकलन समय पर) स्वचालित रूप से प्रकट होते हैं। – irreal