Когда на рабочем столе отображается значок запуска, на экране появляется следующее событие:
blockquote>
- Приложение Homescreen / Launcher отправляет намерение начать действие с использованием функции startActivity () ( startActivity () является вызовом связующего звена для ActivityManager)
- Activity Manager отправляет запрос процесса fork с использованием сокета на Zygote.
- Zygote открывает новый экземпляр виртуальной машины, который загружает ActivityThread (поток активности управляет
- ActivityThread имеет реальный main () для приложения.
.- ActivityThread имеет реальный main () для приложения.
]- ActivityThread вызывает приложение onCreate ().
Поэтому ActivityThread отвечает за создание экземпляра Activity (внутри метода performLaunchActivity)
Объяснение:
Если вы наблюдаете stacktrace:
android.app.Instrumentation.newActivity(Instrumentation.java:1021) android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2175) android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261)
Код, в котором создается новая активность:
private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) { ... //More code Activity activity = null; try { java.lang.ClassLoader cl = r.packageInfo.getClassLoader(); activity = mInstrumentation.newActivity( cl, component.getClassName(), r.intent); StrictMode.incrementExpectedActivityCount(activity.getClass()); r.intent.setExtrasClassLoader(cl); r.intent.prepareToEnterProcess(); if (r.state != null) { r.state.setClassLoader(cl); } } catch (Exception e) { if (!mInstrumentation.onException(activity, e)) { throw new RuntimeException( "Unable to instantiate activity " + component + ": " + e.toString(), e); } } ... //More code return activity; }
Ins trumentation.java (класс будет создан для вас перед любым кодом приложения)
public Activity newActivity(ClassLoader cl, String className, Intent intent) throws InstantiationException, IllegalAccessException, ClassNotFoundException { return (Activity)cl.loadClass(className).newInstance(); }
РЕДАКТИРОВАНИЕ 20.01.2012:Вот это да! решение было настолько более простым и было в платформе почти навсегда. , Как указано knightpfhor:
string.Compare(s1, s2, CultureInfo.CurrentCulture, CompareOptions.IgnoreNonSpace);
<час> Вот функция, которая разделяет диакритические знаки от строки:
static string RemoveDiacritics(string text)
{
string formD = text.Normalize(NormalizationForm.FormD);
StringBuilder sb = new StringBuilder();
foreach (char ch in formD)
{
UnicodeCategory uc = CharUnicodeInfo.GetUnicodeCategory(ch);
if (uc != UnicodeCategory.NonSpacingMark)
{
sb.Append(ch);
}
}
return sb.ToString().Normalize(NormalizationForm.FormC);
}
[еще 119] детали на блоге MichKap ( RIP... ).
принцип, это, это поворачивает 'Г©' в 2 последовательных символа 'e', острый. Это затем выполняет итерации через символы и пропускает диакритические знаки.
"hГ©llo" становится "he< acute> Лло", который в свою очередь становится "привет".
Debug.Assert("hello"==RemoveDiacritics("héllo"));
<час> Примечание: вот более компактный.NET4 + дружественная версия той же функции:
static string RemoveDiacritics(string text)
{
return string.Concat(
text.Normalize(NormalizationForm.FormD)
.Where(ch => CharUnicodeInfo.GetUnicodeCategory(ch)!=
UnicodeCategory.NonSpacingMark)
).Normalize(NormalizationForm.FormC);
}
попробуйте эту перегрузку на Строке. Сравните Метод.
Строка. Сравните Метод (Строка, Строка, булевская переменная, CultureInfo)
, Это производит международное значение на основе сравнить операций включая cultureinfo., пример на странице сравнивает "Изменение" в en-США и en-CZ. CH в en-CZ является единственной "буквой".
пример из ссылки
using System;
using System.Globalization;
class Sample {
public static void Main() {
String str1 = "change";
String str2 = "dollar";
String relation = null;
relation = symbol( String.Compare(str1, str2, false, new CultureInfo("en-US")) );
Console.WriteLine("For en-US: {0} {1} {2}", str1, relation, str2);
relation = symbol( String.Compare(str1, str2, false, new CultureInfo("cs-CZ")) );
Console.WriteLine("For cs-CZ: {0} {1} {2}", str1, relation, str2);
}
private static String symbol(int r) {
String s = "=";
if (r < 0) s = "<";
else if (r > 0) s = ">";
return s;
}
}
/*
This example produces the following results.
For en-US: change < dollar
For cs-CZ: change > dollar
*/
для этого для языков с диакритическим знаком необходимо будет добраться, культура затем тестируют строки на основе этого.
Следующий метод CompareIgnoreAccents(...)
работы над Вашими данными в качестве примера. Вот статья, где я получил свою справочную информацию: http://www.codeproject.com/KB/cs/EncodingAccents.aspx
private static bool CompareIgnoreAccents(string s1, string s2)
{
return string.Compare(
RemoveAccents(s1), RemoveAccents(s2), StringComparison.InvariantCultureIgnoreCase) == 0;
}
private static string RemoveAccents(string s)
{
Encoding destEncoding = Encoding.GetEncoding("iso-8859-8");
return destEncoding.GetString(
Encoding.Convert(Encoding.UTF8, destEncoding, Encoding.UTF8.GetBytes(s)));
}
я думаю, что дополнительный метод был бы лучше:
public static string RemoveAccents(this string s)
{
Encoding destEncoding = Encoding.GetEncoding("iso-8859-8");
return destEncoding.GetString(
Encoding.Convert(Encoding.UTF8, destEncoding, Encoding.UTF8.GetBytes(s)));
}
Затем использование было бы этим:
if(string.Compare(s1.RemoveAccents(), s2.RemoveAccents(), true) == 0) {
...