Форум программистов, компьютерный форум CyberForum.ru

Сразу после нажатия Power вызывается OnCreate. Почему? - Android

Войти
Регистрация
Восстановить пароль
 
VV0lk
11 / 1 / 0
Регистрация: 25.12.2011
Сообщений: 169
25.03.2016, 10:06     Сразу после нажатия Power вызывается OnCreate. Почему? #1
Здравствуйте. Пишу вообще под Mono.Android, но в той ветке глухо, да и код очень похож на Java, так что это я думаю не проблемма, да и вопрос не в этом. В общем: основное Activity наследуется от TabActivity (знаю, что устарело, но так надо..) В OnCreate, ничего особенного нет, создаются вкладки, загружается ранее сохраненная информация:
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
        protected override void OnCreate (Bundle bundle)
        {
            base.OnCreate (bundle);
            this.RequestWindowFeature (WindowFeatures.NoTitle); //Создать вьюху без заголовка
            mSettings =  GetSharedPreferences(APP_PREFERENCES, FileCreationMode.Private);
 
            Load_SharedPreferences();
 
 
            SetContentView(TabHost);
            CreateTab(typeof(Connect_Activity), "Подключение",     GetString(Resource.String.connection));
            CreateTab(typeof(Main_Input_data_Activity), "Главная", GetString(Resource.String.main));
            CreateTab(typeof(Settings_Activity), "Настройки",      GetString(Resource.String.settings) );
            if( LayoutInflater.Inflate(Resource.Layout.Graf_act, null).FindViewById<ImageButton>(Resource.Id.MenuButton)!=null) //если нет кнопки меню у графиков, т.е. запустили на планшете
                CreateTab(typeof(Grafics_Activity), "Графики", GetString(Resource.String.graphics));
            else
                CreateTab(typeof(Grafics_Activity_large), "Графики", GetString(Resource.String.graphics)); //постоянно отображаемая панель меню графиков
 
            Change_TabHost_Text_size ();
 
 
            if(current_tag!="")
            {
                TabHost.SetCurrentTabByTag (current_tag); //выделить ту вкладку, которая была сохранена перед выключением
                current_tag="";
            }
 
            //---произвести загрузку серриализированного класса singletone с введенными пользователем данными
            try
            {
                Serializer.LoadFromBinnary<All_user_entered_info>(System.IO.Path.Combine(System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal), File_name_user_entered_info));
            }
            catch{}
 
            //экземпляр класса PowerManager.WakeLock  чтоб не гас экран 
            var _powerManager = (PowerManager) GetSystemService(PowerService);
            sWakeLock = _powerManager.NewWakeLock(WakeLockFlags.ScreenBright, "MyTag");
        }
        
        
        
        private void CreateTab(Type activityType, string tag, string label)
        {
            var intent = new Intent(this, activityType);
            intent.AddFlags(ActivityFlags.NewTask);
            var spec = TabHost.NewTabSpec(tag);
            spec.SetIndicator (label); //, drawableIcon);
            spec.SetContent(intent);
            TabHost.AddTab(spec);
        }

В OnPause и OnDestroy, тоже ничего криминального не происходит:
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
protected override void OnPause ()
        {
            base.OnPause ();
 
            // Запоминаем данные
            ISharedPreferencesEditor editor = mSettings.Edit();
            editor.PutString(APP_PREFERENCES_LANG, current_lang);
            if(!String.IsNullOrWhiteSpace( Main_Input_data_Activity.Current_Fragment))
                editor.PutString (APP_PREFERENCES_CURRENT_FRAGMENT, Main_Input_data_Activity.Current_Fragment);
            editor.PutString(APP_PREFERENCES_THEME, current_theme);
            if(current_tag!="")
                editor.PutString(APP_PREFERENCES_SELECT_TAB, TabHost.CurrentTabTag);
            editor.Apply ();
 
            //произвести серриализацию класса singletone с введенными пользовательскими данными в файл
            Serializer.SaveToBinnary<All_user_entered_info> (System.IO.Path.Combine (System.Environment.GetFolderPath (System.Environment.SpecialFolder.Personal), File_name_user_entered_info), All_user_entered_info.Instance);
        }
 
//выключение BT при завершении приложения
        protected override void OnDestroy ()
        {
            base.OnDestroy ();
 
            if ((My_Bluetooth.mBluetoothAdapter.Enable ()) & (Main_tabs_Activity.restart_flag == false)) //если БТ включен и это выключение, а не перезапуск для смены темы, то
                My_Bluetooth.mBluetoothAdapter.Disable ();
            
            Main_tabs_Activity.restart_flag = false; //отчистить флаг
        }

И всё отлично работает, но как только я нажимаю хардовую кнопку "Power" на тел. (в каком бы Actyvity или фрагменте я не находился) гаснет экран и буквально через пол секунды сам вызывается OnCreate этой, главной активити! Естественно он опять пытается создать табы. И входя в конструктор первой активности-вкладки (класс Connect_Activity) в её SetContentView (Resource.Layout.Connect_act); получаем исключение Android.Content.Res.Resources+NotFoundException. И приложение сыпется... Почему вообще так происходит? Из-за чего вообще может вызыватся OnCreate при погасании экрана?!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.03.2016, 10:06     Сразу после нажатия Power вызывается OnCreate. Почему?
Посмотрите здесь:

Приложение останавливается сразу после открытия Android
Не работает приложение после нажатия кнопки home Android
Почему вызывается onDismiss Android
Android Падает приложение сразу после on Create
Метод вызывается только после второго нажатия на кнопку Android
Android После засыпания вызывается onCreate и onRestoreInstanceState
Android Ошибка в v23 сразу после создания проекта
OnCreate вызывается дважды Android
GridView после нажатия назад возвращается на первую ячейку Android
Android NullPointer в OnCreate
Android Почему Android Studio не сразу подхватывает изменения кода(только после переустановки apk)?
Вывод изображения после нажатия кнопки Android

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Паблито
резкий
1896 / 1630 / 508
Регистрация: 12.05.2014
Сообщений: 5,864
Завершенные тесты: 1
25.03.2016, 14:39     Сразу после нажатия Power вызывается OnCreate. Почему? #2
в коде создается wakelock
он где в onpause/stop срабатывает? wakeLock.acquire(); например

когда гаснет экран - ondestroy срабатывает? вывод в лог туда поставить надо бы
VV0lk
11 / 1 / 0
Регистрация: 25.12.2011
Сообщений: 169
25.03.2016, 16:58  [ТС]     Сразу после нажатия Power вызывается OnCreate. Почему? #3
в коде создается wakelock
он где в onpause/stop срабатывает? wakeLock.acquire(); например
Он включаеться потом в одном фрагменте, а выключается в другом. Но да это не важно, я думаю. Т.к. я для проверки создал новый проект, в котором 3-класса:
MainActyvity
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
[Activity (Label = "Test_TabApp", MainLauncher = true, Icon = "@mipmap/icon",ScreenOrientation= Android.Content.PM.ScreenOrientation.Landscape)]
    public class MainActivity : TabActivity
    {
        
        protected override void OnCreate (Bundle savedInstanceState)
        {
            base.OnCreate (savedInstanceState);
            this.RequestWindowFeature (WindowFeatures.NoTitle); //Создать вьюху без заголовка
 
            SetContentView (TabHost);
            CreateTab(typeof(Connect_Activity), "Подключение",     "Подключение");
            CreateTab(typeof(Main_Input_data_Activity), "Главная", "Главная");
        }
 
 
        private void CreateTab(Type activityType, string tag, string label)  //, int drawableId)
        {
            var intent = new Intent(this, activityType);
            intent.AddFlags(ActivityFlags.NewTask);
            var spec = TabHost.NewTabSpec(tag);
            spec.SetIndicator(label); //, drawableIcon);
            spec.SetContent(intent);
            TabHost.AddTab(spec);
        }
 
 
    }

Connect_Activity
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
[Activity]
    public class Connect_Activity : Activity
    {
        
 
        protected override void OnCreate (Bundle bundle)
        {
            base.OnCreate (bundle);
            SetContentView (Resource.Layout.Connect_act);
        }
            
    }

и Main_Input_data_Activity
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
[Activity]  
    public class Main_Input_data_Activity  : Activity
    {
 
        protected override void OnCreate (Bundle bundle)
        {
            base.OnCreate (bundle);
            SetContentView (Resource.Layout.Input_dat_act);
 
        }
 
    }

В которых нет ничего! И всё равно наблюдаю такой-же эффект! Нажимая power в строке
C#
1
SetContentView (Resource.Layout.Connect_act);
Сразу вижу исключение Android.Content.Res.Resources+NotFoundException
Кликните здесь для просмотра всего текста
Android.Content.Res.Resources+NotFoundException: Resource ID #0x7f030000
at android.content.res.Resources$NotFoundException: Resource ID #0x7f030000
at at android.content.res.Resources.getValue(Resources.java:1163)
at at android.content.res.Resources.loadXmlResourceParser(Resources.java:2349)
at at android.content.res.Resources.getLayout(Resources.java:979)
at at android.view.LayoutInflater.inflate(LayoutInflater.java:395)
at at android.view.LayoutInflater.inflate(LayoutInflater.java:353)
at at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:315)
at at android.app.Activity.setContentView(Activity.java:1973)
at at md5c62c62cec7e539e725691719b812cf8e.Connect_Activity.n_onCreate(Native Method)
at at md5c62c62cec7e539e725691719b812cf8e.Connect_Activity.onCreate(Connect_Activity.java:28)
at at android.app.Activity.performCreate(Activity.java:5275)
at at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
at at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2166)
at at android.app.ActivityThread.startActivityNow(ActivityThread.java:2040)
at at android.app.LocalActivityManager.moveToState(LocalActivityManager.java:135)
at at android.app.LocalActivityManager.startActivity(LocalActivityManager.java:347)
at at android.widget.TabHost$IntentContentStrategy.getContentView(TabHost.java:749)
at at android.widget.TabHost.setCurrentTab(TabHost.java:413)
at at android.widget.TabHost.addTab(TabHost.java:240)
at at md5c62c62cec7e539e725691719b812cf8e.MainActivity.n_onCreate(Native Method)
at at md5c62c62cec7e539e725691719b812cf8e.MainActivity.onCreate(MainActivity.java:28)
at at android.app.Activity.performCreate(Activity.java:5275)
at at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
at at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2166)
at at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2252)
at at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3757)
at at android.app.ActivityThread.access$900(ActivityThread.java:139)
at at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1206)
at at android.os.Handler.dispatchMessage(Handler.java:102)
at at android.os.Looper.loop(Looper.java:136)
at at android.app.ActivityThread.main(ActivityThread.java:5103)
at at java.lang.reflect.Method.invokeNative(Native Method)
at at java.lang.reflect.Method.invoke(Method.java:515)
at at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:790)
at at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:606)
at at dalvik.system.NativeStart.main(Native Method)


Добавлено через 8 минут
Один в один, практически, как в этом примере: https://developer.xamarin.com/guides...g_a_tabbed_ui/

Добавлено через 1 час 8 минут
Нашел в чем беда! Во всём виновата строка
C#
1
ScreenOrientation= Android.Content.PM.ScreenOrientation.Landscape
Убираю её, всё нормально. Тушу экран, возобновляю, всё остается на своих местах, OnCreate не вызывается. Теберь буду думать как это победить, т.к. мне надо, чтобы приложение было только в горизонтальном виде. Если оставляю только папку layout-land, то ругается на SetContentView (Resource.Layout.Main); не видет ресурсы...

Добавлено через 39 минут
Так. Ну вроде разобрался!... Значит получается так: когда программа запущена в портретной ориентации, то нажатие power не вызывает OnCreate и даже все данные остаются на месте. А когда в горизонтальном виде нажимаешь, то OnCreate вызывается и ищет ресурсы в папке layout, а их там у меня нет, они все в папке layout-land - отсюда и исключения. Сейчас перенес все ресурсы из layout-land в layout, из layout-large-land в layout-large и т.д. и оставил
C#
1
ScreenOrientation= Android.Content.PM.ScreenOrientation.Landscape
И всё работает нормально. Вылетать перестало. Теперь осталось придумать как вообще избежать этого перезапуска и почему он возникает только при горизонтальном расположении?! (а то все подключенные по BT устройства отваливаются и их по новой надо подключать, а разруливать это труднее, чем избежать повторного OnCreate, покрайне мери пока мне так кажеться...)
Yandex
Объявления
25.03.2016, 16:58     Сразу после нажатия Power вызывается OnCreate. Почему?
Ответ Создать тему
Опции темы

Текущее время: 05:26. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru