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

Программирование Android

Войти
Регистрация
Восстановить пароль
 
VV0lk
11 / 1 / 0
Регистрация: 25.12.2011
Сообщений: 171
#1

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

25.03.2016, 10:06. Просмотров 214. Ответов 2
Метки нет (Все метки)

Здравствуйте. Пишу вообще под 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 при погасании экрана?!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.03.2016, 10:06
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Сразу после нажатия Power вызывается OnCreate. Почему? (Программирование Android):

После засыпания вызывается onCreate и onRestoreInstanceState - Программирование Android
Привет. После засыпания вызывается onCreate и onRestoreInstanceState, зачем они вызываются и как обойти? У меня программа для работы...

OnCreate вызывается дважды - Программирование Android
Добрый день. Делаю простое приложение, которое при нажатии на кнопку, с помощью Intent должно переходить на следующее активити. Но проблема...

Метод вызывается только после второго нажатия на кнопку - Программирование Android
есть метод import com.github.nkzawa.emitter.Emitter; import com.github.nkzawa.socketio.client.Ack; import...

Почему Android Studio не сразу подхватывает изменения кода(только после переустановки apk)? - Программирование Android
Иногда после изменения кода в Android Studio (к примеру изменю вывод Log.d )и запуска его смартфоне или эмуляторе, приложение, как будто бы...

Почему вызывается onDismiss - Программирование Android
Привет. У меня есть DialogFragment, который вызывается в главной активности. Когда я меняю ориентацию экрана (диалог открыт), мне нужно...

Эмулятор исчезает сразу после запуска - Программирование Android
Запускаю в Android Studio эмулятор, окно открывается на пару секунд и исчезает. В чем может быть причина? Может быть кто сталкивался.

2
Pablito
2505 / 1989 / 619
Регистрация: 12.05.2014
Сообщений: 6,943
Завершенные тесты: 1
25.03.2016, 14:39 #2
в коде создается wakelock
он где в onpause/stop срабатывает? wakeLock.acquire(); например

когда гаснет экран - ondestroy срабатывает? вывод в лог туда поставить надо бы
0
VV0lk
11 / 1 / 0
Регистрация: 25.12.2011
Сообщений: 171
25.03.2016, 16:58  [ТС] #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, покрайне мери пока мне так кажеться...)
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.03.2016, 16:58
Привет! Вот еще темы с ответами:

Падает приложение сразу после on Create - Программирование Android
import android.app.Activity; import android.content.Context; import android.content.Intent; import android.content.res.Configuration;...

Приложение останавливается сразу после открытия - Программирование Android
Приложение открывается и сразу has stoped просто пытаюсь присвоить текст TextView package com.example.time; import...

После включения системы в розетку сразу включается комп(без нажатия Power) - Компьютерное железо
Здравствуйте,подскажите что может быть После включения системы в розетку сразу же включается комп(без нажатия кнопки Power)? а бывает...

После включения системы в розетку сразу включается комп(без нажатия на Power) - Компьютерное железо
Здравствуйте,подскажите что может быть: Включаю комп в розетку и он сразу же стартует - начинает работать кулер ЦП и сам БП. И тут...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

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