我一直在使用Android包含在支持库中的新嵌套片段 API.
我面对嵌套片段的问题是,如果嵌套片段(即通过FragmentManager
返回的by 已经添加到另一个片段的片段getChildFragmentManager()
)调用startActivityForResult()
,onActivityResult()
则不会调用嵌套片段的方法.但是,父片段onActivityResult()
和活动onActivityResult()
都会被调用.
我不知道我是否遗漏了有关嵌套片段的内容,但我没想到所描述的行为.下面是重现此问题的代码.如果有人能指出我正确的方向并向我解释我做错了什么,我将非常感激:
package com.example.nestedfragmentactivityresult;
import android.media.RingtoneManager;
import android.os.Bundle;
import android.content.Intent;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends FragmentActivity
{
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
this.getSupportFragmentManager()
.beginTransaction()
.add(android.R.id.content, new ContainerFragment())
.commit();
}
public void onActivityResult(int requestCode, int resultCode, Intent data)
{
super.onActivityResult(requestCode, resultCode, data);
// This is called
Toast.makeText(getApplication(),
"Consumed by activity",
Toast.LENGTH_SHORT).show(); …
Run Code Online (Sandbox Code Playgroud) 多年来,我一直在使用Java Memory Model进行日常工作.我认为我对数据竞争的概念以及避免它们的不同方法(例如,同步块,易变变量等)有很好的理解.但是,仍然有一些我认为我完全不了解内存模型的东西,这是类的最终字段应该是线程安全的方式而没有任何进一步的同步.
所以根据规范,如果一个对象被正确初始化(也就是说,没有引用对象在其构造函数中以某种方式转义,使得引用可以被另一个线程看到),那么,在构造之后,任何看到该对象的线程对象将保证看到对象的所有最终字段的引用(在它们构造时的状态),没有任何进一步的同步.
特别是,标准(http://docs.oracle.com/javase/specs/jls/se7/html/jls-17.html#jls-17.4)说:
最终字段的使用模型很简单:在该对象的构造函数中设置对象的最终字段; 并且在对象的构造函数完成之前,不要在另一个线程可以看到的地方写入对正在构造的对象的引用.如果遵循此原因,那么当另一个线程看到该对象时,该线程将始终看到该对象的最终字段的正确构造版本.它还将看到那些最终字段引用的任何对象或数组的版本,这些字段至少与最终字段一样是最新的.
他们甚至给出了以下示例:
class FinalFieldExample {
final int x;
int y;
static FinalFieldExample f;
public FinalFieldExample() {
x = 3;
y = 4;
}
static void writer() {
f = new FinalFieldExample();
}
static void reader() {
if (f != null) {
int i = f.x; // guaranteed to see 3
int j = f.y; // could see 0
}
}
}
Run Code Online (Sandbox Code Playgroud)
其中线程A应该运行"reader()",并且线程B应该运行"writer()".
到目前为止,显然是如此的好.
我主要担心的是......这在实践中真的有用吗?据我所知,为了使线程A(运行"reader()")看到对"f"的引用,我们必须使用一些同步机制,例如使f volatile,或者使用lock来同步访问F.如果我们不这样做,我们甚至不能保证"reader()"将能够看到初始化的"f",也就是说,由于我们没有同步访问"f",读者可能会看到" null"而不是由writer线程构造的对象.这个问题在http://www.cs.umd.edu/~pugh/java/memoryModel/jsr-133-faq.html#finalWrong中说明,这是Java内存模型的主要参考之一[大胆强调我的]:
现在,已经说过所有这些,如果在一个线程构造一个不可变对象(即一个只包含最终字段的对象)之后,你想确保所有其他线程都能正确看到它,你仍然通常需要使用同步.例如,没有其他方法可以确保第二个线程可以看到对不可变对象的引用.程序从最终字段获得的保证应该仔细调整,仔细了解如何在代码中管理并发.
因此,如果我们甚至不能保证看到对"f"的引用,那么我们必须使用典型的同步机制(volatile,lock等),并且这些机制确实已经导致数据争用消失,最终的需求是我甚至都不会考虑的事情.我的意思是,如果为了使"f"对其他线程可见,我们仍然需要使用volatile或synchronized块,并且它们已经使内部字段对其他线程可见......有什么意义(在线程安全术语中)首先在场上进行决赛?
我已经使用Git一段时间了,并且最近被问到为什么它的合并和分支功能比SVN更好.多年前,当我使用SVN时,我发现分支和合并是非常麻烦且容易出错的操作.结果,我几乎没有分支.然而,就在上周我尝试了新的SVN 1.8版本,我发现它做得非常好.
我实际上尝试了一些复杂的分支,我没有搞笑的错误.当然,它非常缓慢,但我主要关心的是功能,而不是速度(至少在试图说服某人时).
所以我的问题是SVN v1.8和Git分支/合并功能有多大不同.特别是,我也有兴趣知道是否有一些分支和合并操作(或工作流程)可以用Git完成但不能用SVN完成(或者可以用SVN完成,但这很困难).
谢谢.
我已经阅读了许多关于是否可以阻止Android应用程序启动的问题,但所有答案似乎都是"不,你不能".
这个想法非常简单:我们希望用户能够使用将在其移动设备上预先安装的重新设定的应用程序集.如果用户尝试启动未授权的应用程序,系统将提示他输入要求输入PIN的对话框.如果他输入正确的PIN,那么他将能够运行该应用程序.否则,将不会运行该应用程序.
正如我之前所说,我可以找到的所有答案分为两类:"你不能那样做"和"你可以通过编写你自己的启动器应用程序来做到这一点".
但是,我已经看到了像ZDBox这样的应用程序,它们可以让你做到这一点.也就是说,使用ZDBox,您可以定义"非授权"应用程序,如果用户尝试启动其中一个,则需要输入PIN才能实际启动应用程序.如果他没有提供,应用程序将无法启动.有趣的是,ZDBox不需要root访问权来执行此操作.
所以我的问题是,我们如何阻止其他应用启动,就像ZDBox一样?
我正在开发一个Android应用程序,我们需要在某些情况下关闭设备.
我已经在很多地方读到你需要一个带根电话才能这样做.然后,您可以使用Java的API发出"reboot"命令:
try {
Process proc = Runtime.getRuntime()
.exec(new String[]{ "su", "-c", "reboot -p" });
proc.waitFor();
} catch (Exception ex) {
ex.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
我实际上已经在Cyanogenmod 10设备(三星Galaxy S3)中尝试过它,它可以工作.但是,我们不希望使用root设备来关闭它,因为最终用户将能够执行我们公司不允许的非预期事情.
另一方面,我们的申请是由制造商的证书签署的,在这种情况下是Cyanogen的.我已经读过,通过使用制造商的证书签署您的应用程序,您应该能够发出特权命令(就像root一样).但是,即使我将我的应用程序安装为使用制造商证书签名的系统应用程序,上述代码也不起作用:
如果我离开命令的"su"部分,则会显示"超级用户请求"屏幕,但这是我们试图避免的.
如果我删除"su"部分(只是离开"reboot -p"),则会默默忽略该命令.
因此,我们无法使用我们的系统应用程序关闭我们的设备,该系统应用程序使用了显示器的证书.所以我的问题是,我该怎么做呢?
EDITED
顺便说一句,万一有人不确定它:应用程序已正确签名并作为系统应用程序安装,因为我们实际上可以访问一些受限制的API,例如PowerManager.goToSleep()