02 App Lifecycle & Properties

作者: 归零者 分类: UI学习 发布时间: 2017-09-06 12:22

学习目标

  1. Application.Current.Properties[“displayLabelText”] = displayLabel.Text;


不用担心key 值不存在于Properties,若不存在会自动新增一组新的key-value。

复原值:

  1. IDictionary properties = Application.Current.Properties;
  2.  
  3. if(properties.ContainsKey(“displayLabelText”))
  4. {
  5. displayLabel.Text = properties[“displayLabelText”] as
    string;
  6. }

 

其实相当简单,就是将值丢进Properties,要用的时候再藉由key取出来,而这个Application.Current.Properties可以把他想成不死系的字典物件… 

App Lifecycle

一般来说Properties会搭配App lifecycle一起使用,底下三个function可以在App看到: 

  1. public
    class
    App : Application

  2. {

  3. public
    App()
  4. {

  5. }
  6.  

  7. protected
    override
    void
    OnStart()
  8. {

  9. // Handle when your app starts
  10. }
  11.  

  12. protected
    override
    void
    OnSleep()
  13. {

  14. // Handle when your app sleeps
  15. }
  16.  

  17. protected
    override
    void
    OnResume()
  18. {

  19. // Handle when your app resumes
  20. }
  21. }


最重要是OnSleep这方法,一般来说,当手机太久没使用就会进入睡眠模式,一旦进入睡眠模式后,执行中的App就会被中断并呼叫OnSleep方法。

若App是因为本身crash而关闭,就不会呼叫OnSleep方法。

测试OnSleep 最简单的方法就是当你在执行App 时,按下Home 或是Back 键,就能将App 中断。


问题来了
,通常要储存的值会出现在一般的Page类别内,而OnSleep方法存在于  App类别. ..Page和App势必要透过一些方法沟通,才能于App内的方法储存Page的值

这里提供一个方法,
可以先在App类别下宣告需要被储存的变数( 全域 ): 

  1. public
    class
    App : Application

  2. {

  3. public
    App()
  4. {

  5. }
  6.  

  7. public
    string
    DisplayLabelText { set; get; }
  8.  
  9. }

在OnSleep 时将此全域变数存入Properties 内,而在App 建构子时将Properties 存下的值指派回全域变数: 

  1. namespace PersistentKeypad
    								
  2. {
    							
  3. 
    							public
    									class
    											App : Application
    														
  4.     {
    							
  5. 
    							const
    									string displayLabelText = "displayLabelText";
    													
  6. 
    							public
    									App()
    											
  7.         {
    							
  8. 
    							if (Properties.ContainsKey(displayLabelText))
    													
  9.             {
    							
  10. 
    							DisplayLabelText = (string)Properties[displayLabelText];
    													
  11.             }
    							
  12.  
  13. 
    							MainPage = new
    											PersistentKeypadPage();
    													
  14.         }
    							
  15. 
    							public
    									string
    											DisplayLabelText { set; get; }
    																	
  16. 
    							protected
    									override
    											void
    													OnStart()
    															
  17.         {
    							
  18. 
    							// Handle when your app starts 
    								
  19.         }
    							
  20. 
    							protected
    									override
    											void
    													OnSleep()
    															
  21.         {
    							
  22. 
    							// Handle when your app sleeps 
    								
  23. 
    							Properties[displayLabelText] = DisplayLabelText;
    											
  24.         }
    							
  25. 
    							protected
    									override
    											void
    													OnResume()
    															
  26.         {
    							
  27. 
    							// Handle when your app resumes 
    								
  28.         }
    							
  29.     }
    							
  30. }
    							


上面范例为了避免拼字错误,所以先将key值用displayLabelText变数存下。

接着来看Page那一端: 

  1. public
    class
    PersistentKeypadPage : ContentPage

  2. {

  3. Label displayLabel;

  4. Button backspaceButton;
  5.  

  6. public
    PersistentKeypadPage()
  7. {

  8. //RESTORE

  9. // New code for loading previous keypad text.

  10. App app = Application.Current
    as
    App;
  11. displayLabel.Text = app.DisplayLabelText;
  12. }
  13.  
  14.  

  15. void
    OnButtonClicked(object sender, EventArgs args)
  16. {

  17. Button button = (Button)sender;
  18. displayLabel.Text += (string)button.StyleId;
  19.  

  20. // Save keypad text.

  21. App app = Application.Current
    as
    App;
  22. app.DisplayLabelText = displayLabel.Text;
  23. }
  24. }


可以看到程式Page内都是透过app.DisplayLabelText这全域变数在运作,

利用全域变数这样简单的沟通,就能达到我们App中断时存下画面上的资讯这目的。

如果觉得我的文章对您有用,请随意赞赏。您的支持将鼓励我继续创作!

说点什么

avatar
  Subscribe  
提醒
跳至工具栏